如何在OpenID Connect/OAuth2隐式流中获取新的访问令牌

mar*_*icz 5 oauth-2.0 openid-connect keycloak implicit-flow

我目前正在移动应用中使用OpenID Connect/Oauth2 Implicit Flow.我正在为用户提供Web视图以登录并获取访问令牌和到期日期.但是,当访问令牌过期时,是否需要让用户再次登录?或者有没有办法使用当前的方式静默获取新的访问令牌,而不会窃听用户.我想另一个选择是将令牌到期设置为很长时间,但我已经读到这是一个坏主意.

我在这里错过了什么吗?

Kav*_*uwa 6

由于隐式流不发送刷新令牌(如RFC6746第 9 节中所述),因此不可能使用刷新令牌。但作为一种解决方法,可以使用客户端凭据授予来获取访问令牌。

一个可行的解决方案是首先遵循隐式流程并对客户端进行身份验证。然后客户端身份验证授权可用于执行所需的 API 调用。

示例请求(来自RFC6749

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

 grant_type=client_credentials
Run Code Online (Sandbox Code Playgroud)

示例响应(来自RFC6749

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
   "access_token":"2YotnFZFEjr1zCsicMWpAA",
   "token_type":"example",
   "expires_in":3600,
   "example_parameter":"example_value"
}
Run Code Online (Sandbox Code Playgroud)

PS - 如果您正在使用授权代码流,您可以使用它refresh_token来获取新的访问令牌。可以从OAuth2 文档中获取如何形成请求。请注意,为此,您的授权响应应包含“refresh_token”。

刷新令牌应该像用户凭证一样受到保护。可以从这里的keycloak 文档中阅读更多内容

示例请求和响应(来自RFC6749

要求

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
Run Code Online (Sandbox Code Playgroud)

回复

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "access_token": "TlBN45jURg",
  "token_type": "Bearer",
  "refresh_token": "9yNOxJtZa5",
  "expires_in": 3600
}
Run Code Online (Sandbox Code Playgroud)

  • 对于“隐式流”,不存在刷新令牌之类的东西。 (2认同)