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

时间:2017-06-29 01:30:02

标签: oauth-2.0 openid-connect keycloak implicit-flow

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

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:3)

由于隐式流不发送刷新令牌(如RFC6746的section 9中所述),因此无法使用刷新令牌。但作为一种解决方法,可以使用client credential grant来获取访问令牌。

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

示例请求(来自RFC6749

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

 rant_type=client_credentials

样本resposne(来自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"
}

P.S - 如果您使用 授权代码流 ,则可以使用refresh_token获取新的访问令牌。如何形成请求可以从OAuth2 documentation获得。请注意,为此,您的授权响应应包含`refresh_token。

应该保护刷新令牌与用户的凭证一样有价值。可以从here

的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

<强>响应

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
}

答案 1 :(得分:1)

推荐的方法是使用外部浏览器和授权代码流程。检查OAuth 2.0 for Native Apps RFC。对于Android,还有一个支持库AppAuth。通过此流程,您可以使用刷新令牌来获取新的访问令牌,但是客户端密钥存在问题(通常需要访问/令牌端点),因为您无法在移动应用程序中保持安全(#39 ;在RFC中描述。

如果您决定坚持使用WebView和Implicit Flow(这是不安全的(您的应用程序可以看到密码),您可以使用与JavaScript应用程序相同的技术 - 使用/auth?...&prompt=none URL请求新的令牌如果他仍然在那里打开会话,它将返回一个新的令牌,而不会要求用户提供凭据。