2017-08-11 156 views
0

我試圖實現基於令牌的身份驗證,對Web2py上構建的一些REST API。我正在使用版本2.14.6(穩定)。正如文檔中提到的,我遵循了這些步驟,並能夠使用JWT驗證和檢索受認證保護的資源中的數據。我也做了以下步驟:Web2py基於JWT的身份驗證 - 刷新令牌

from gluon.tools import AuthJWT 

myjwt = AuthJWT(auth, secret_key='secret', user_param="email") 

def login_take_token(): 
    return myjwt.jwt_token_manager() 

@myjwt.allows_jwt() 
@auth.requires_login() 
def get_my_service(): 
    my_code 

所以用這個配置,我可以打了一個電話的功能「login_take_token」,也從「get_my_service」獲取所需的數據時,得到的令牌。下面是服務電話:

/app/controller/login_take_token?email=abc.com&password=abc123 

這將返回美國令牌說

/app/controller/get_my_service?_token=<TOKEN_RECEIVED> 

這將返回我們成功登錄所需的預期數據。

我的問題是,正如web2py文檔中所解釋的,如果令牌已過期,那麼我們可以使用該令牌並致電login_take_token以獲取新的活動令牌。但是,這下面的調用不會返回任何標記,但只返回400錯誤請求,輸出「令牌已過期」。

/app/controller/login_take_token?_token=<TOKEN_RECEIVED> 

應該如何與舊令牌(已過期)進行呼叫以獲取新令牌。

問候

回答

4

默認情況下,verify_expiration=True,這意味着你既不能進行身份驗證,也沒有刷新令牌如果當前令牌已經過期。如果你想允許刷新使用過期的令牌,可以有條件地改變verify_expiration當請求刷新(同時還檢查認證過期):

def login_take_token(): 
    myjwt.verify_expiration = False # This will allow refresh with an expired token. 
    return myjwt.jwt_token_manager() 

注意,還有一個額外的參數,refresh_expiration_delta,默認爲60 * 60(即60分鐘)。如果自原始令牌發佈以來的時間大於refresh_expiration_delta,則刷新請求將被拒絕,並且需要重新進行身份驗證以獲取新令牌。

因此,默認的過期時間爲5分鐘,默認刷新過期增量爲60分鐘,在強制重新進行身份驗證之前,您最多可以獲得12個刷新令牌(假設您每隔5分鐘要求刷新一次)。當然,如果您想延長刷新令牌的發放期限,您可以將refresh_expiration_delta設置爲更高的值。