【问题标题】:How to get new access token in OpenID Connect/OAuth2 Implicit Flow如何在 OpenID Connect/OAuth2 隐式流中获取新的访问令牌
【发布时间】:2017-12-02 13:19:20
【问题描述】:

我目前在移动应用程序中使用 OpenID Connect/Oauth2 Implicit Flow。我正在为用户提供一个 Web 视图来登录并获取访问令牌和到期时间。但是,当访问令牌过期时,我是否需要要求用户重新登录?或者有没有一种方法可以使用当前的访问令牌静默获取新的访问令牌,而不会打扰用户。我想另一种选择是将令牌到期时间设置为很长的时间,但我读过这是一个坏主意。

我错过了什么吗?

【问题讨论】:

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


【解决方案1】:

由于隐式流不发送刷新令牌(如 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

响应示例(来自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"
}

附言- 如果您使用授权码流,您可以使用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
}

【讨论】:

  • 使用“隐式流”没有刷新令牌之类的东西。
  • 好的,我在规范中错过了这一点“当使用隐式授权类型流程时,不返回刷新令牌,这需要在访问令牌过期后重复授权过程。”有什么理由不能使用授权码流吗?
  • 因为我将它与 Couchbase Sync Gateway 结合使用 - 他们基本上推荐使用它。请参阅我与他们一起使用的论坛 convo - forums.couchbase.com/t/cbl-database-name/13233/18
  • 有趣的案例。现在这里是可以使用客户端凭证授予的地方 [tools.ietf.org/html/rfc6749#section-4.4].如何使用它取决于 Keycloak 提供的内容。最初,您需要对最终用户进行身份验证。一旦完成,您就可以使用客户端凭据授予。但是您需要获得适当的授权。这样您就可以改善用户体验。 (一个棘手的解决方案 IMO)
  • 感谢您的研究。我会调查一下,让你知道我的进展。
【解决方案2】:

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

如果您决定坚持使用不安全的 WebView 和隐式流(您的应用程序可以看到密码),您可以使用与 JavaScript 应用程序相同的技术 - 使用/auth?...&prompt=none URL 请求新令牌,这将如果他仍然有一个打开的会话,则返回一个新令牌而不询问用户凭据。

【讨论】:

  • 我正在研究使用 chrome 自定义标签。不幸的是,我认为 Keycloak 不允许 prompt=none。
  • prompt=none 只能在身份提供者中具有有效用户登录状态的情况下使用。一旦令牌过期,将不会有有效的会话(这是大多数身份提供者处理它的方式)。所以在令牌过期之前可以使用prompt=none。无论如何,refresh_tokens 是正确的方式
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2017-09-26
  • 2014-05-02
  • 2016-06-26
  • 2021-10-12
  • 1970-01-01
  • 2013-07-29
  • 2014-06-24
相关资源
最近更新 更多