2016-05-17 52 views
3

我正在實施OAuth2.0 server並試圖讀取concepts of refresh token以及如何使用調用訪問令牌以及如何安全地存儲它。刷新令牌在OAuth2.0中的使用

一本這聽起來很困惑,我的是`因爲Auth2.0令牌短暫的令牌,並登錄後,假設成功的服務器給了我一個令牌,該令牌是這樣的:

{ 
    "token_type":"bearer", 
    "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiVlx1MDAxNcKbwoNUwoonbFPCu8KhwrYiLCJpYXQiOjE0NDQyNjI1NDMsImV4cCI6MTQ0NDI2MjU2M30.MldruS1PvZaRZIJR4legQaauQ3_DYKxxP2rFnD37Ip4", 
    "expires_in":3600, 
    "refresh_token":"fdb8fdbecf1d03ce5e6125c067733c0d51de209c" 
} 

由於訪問令牌是短暫的令牌,並在我的情況下1小時後過期。

假設用戶是browsing a protected resource及其access tokens憑證,並在一段時間後其訪問令牌過期並且他的請求返回類似的響應。

{ 
    "code":401, 
    "error":"invalid_token", 
    "error_description":"The access token provided has expired." 
} 

現在,一個新令牌可以通過使用存儲在瀏覽器cookie新refresh token產生,but doesn't the user experience is getting affected as each time an access token expires in an hour a valid request by a client is getting rejected due to expired access token and then we have to first fetch a new access token and then try that request again.

是否獲取刷新令牌的工作方式類似,僅或者我丟失了一些重要的概念?

又如何能夠安全地刷新令牌在cookie中,因爲它也不是最安全的存儲方式?

+2

這就是爲什麼大多數開發人員檢查expires_in和訪問令牌過期之前得到一個新的5分鐘。這樣用戶不受影響。通常,當我獲得訪問令牌時,我將3600添加到當前時間,然後存儲該令牌,並且我知道何時需要獲取新的訪問令牌。 – DaImTo

+0

@DaImTo另外我怎樣才能安全地在瀏覽器上存儲'刷新令牌'? –

+0

只是將其轉儲到cookie或會話值中,對任何沒有客戶端ID和客戶端祕密的用戶都無用,因此我會假定代碼保留在服務器端。 – DaImTo

回答

0

刷新令牌是一種令牌,用於獲取另一個有效令牌與您使用的API進行交互,因爲令牌壽命很短。然後,因爲令牌的壽命很短,您每次想訪問API時都必須從用戶處獲得另一個oauth2.0憑據。如何避免這種情況? - >刷新令牌。

如前所述,刷新令牌根本不是API訪問令牌,它只是一種用於每次獲取新的短期令牌的令牌。

然後,您的第一個登錄憑證會在用戶同意的情況下獲得令牌和刷新令牌,那麼您不需要用戶同意,只需使用刷新令牌即可。

不知道如果我回答你的問題:)

1

刷新令牌是一種特殊的令牌可以用來獲得在任何時間更新id_token。刷新令牌必須由應用程序安全地存儲,因爲它們實質上允許用戶永遠保持身份驗證。

身份驗證請求的響應可能會導致OAuth發出id_token。該令牌可用於對安全API進行認證調用。

在其他安全措施(如簽名)中,OAuth具有由exp聲明指示的到期日期。但是,本地安裝在桌面或智能手機等設備上的應用程序可能希望避免每次令牌過期時要求用戶輸入憑據。

刷新令牌允許應用程序直接請求OAuth發出新的id_token,而無需重新進行身份驗證。只要刷新標記還沒有被撤銷,它就會工作。

安全考慮

因爲刷新令牌永不過期,重要的是提供了一種方法將其撤消。這可以通過儀表板手動完成,也可以通過Auth的API以編程方式完成。

刷新令牌可以針對應用程序,用戶和設備的每個組合發佈和撤銷。要撤銷刷新令牌,你可以調用撤銷刷新令牌端點:

DELETE https://YOUR_NAMESPACE/api/users/<user id>/refresh_tokens/<refresh token> 

{ 
    "Authorization": "Bearer <your access token>", 
} 

獲取刷新令牌

爲了獲得一個刷新的道理,offline_access範圍和任意設備名稱必須包括當通過/ authorize端點發起認證請求。例如:

GET https://YOUR_NAMESPACE/authorize/? 
    response_type=token 
    &client_id=YOUR_CLIENT_ID 
    &redirect_uri=YOUR_CALLBACK_URL 
    &state=VALUE_THAT_SURVIVES_REDIRECTS 
    &scope=openid%20offline_access 
    &device=my-device 

使用刷新令牌

爲了獲得新id_token,委託端點被使用:

POST https://YOUR_NAMESPACE/delegation 
Content-Type: 'application/json' 
{ 
    "client_id":  "YOUR_CLIENT_ID", 
    "grant_type":  "urn:ietf:params:oauth:grant-type:jwt-bearer", 
    "refresh_token": "your_refresh_token", 
    "api_type":  "app" 
} 

從該請求的響應可以是如下:

{ 
    "token_type": "Bearer", 
    "expires_in": 30000, 
    "id_token": "eyJ..." 
} 

expires_in參數指示這是新的智威湯遜在數秒內的壽命。它可以通過JWT的exp和iat聲明之間的差異來計算。

重要建議:只有當id_token過期時纔會使用refresh_token獲取新令牌。例如,每次執行API調用時,調用端點以獲取新令牌是一種不好的做法。 Auth0中存在速率限制,將限制可以使用相同令牌從特定IP到該端點完成的請求數量。

進一步閱讀嘗試以下鏈接

https://auth0.com/docs/refresh-token