当前位置: 首页 > 知识库问答 >
问题:

Keycloak仅在首次登录时获得Google刷新令牌

何烨华
2023-03-14

我正在使用Keycloak与Google作为身份提供商。我需要谷歌的刷新令牌来管理用户的日历。以下是我的Keycloak Google IDP设置:

登录后,我根据https://www . key cloak . org/docs/latest/server _ development/index . html # retrieving-external-IDP-tokens获取刷新令牌。看起来像这样:

{
    "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "expires_in": 3599,
    "refresh_expires_in": 0,
    "refresh_token": "YYYYYYYYYYYYYYYYYYYYYYYYYYYY",
    "token_type": "Bearer",
    "id_token": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
    "not-before-policy": 0,
    "scope": "openid https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile",
    "accessTokenExpiration": 1593706596
}

现在的问题是,当我第二次登录,然后再次尝试获取刷新令牌时,它消失了:

{
    "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "expires_in": 3599,
    "refresh_expires_in": 0,
    "token_type": "Bearer",
    "id_token": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
    "not-before-policy": 0,
    "scope": "https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid",
    "accessTokenExpiration": 1593706782
}

我真的不确定这怎么可能。我想到的一件事是,Keycloak不尊重子请求登录的“请求刷新令牌”设置,但我不知道如何验证这一点。

共有1个答案

麹凯捷
2023-03-14

这不是Keycloak的错误,而是Google规范。仅在用户首次授权时提供refresh_token。以下是此行为的文档:

refresh_token:可用于获取新访问令牌的令牌。刷新令牌在用户撤消访问之前有效。同样,只有当您在对Google授权服务器的初始请求中将access_type参数设置为offline时,此字段才会出现在该响应中。-来源

如果您想再次获取刷新令牌,您必须:

  1. 转到显示可以访问您帐户的应用程序的页面:https://myaccount.google.com/u/0/permissions.
  2. 在第三方应用菜单下,选择您的应用。
  3. 单击删除访问权限,然后单击确定以确认
  4. 您发出的下一个OAuth2请求将返回refresh_token(前提是它还包含'access_type=离线'查询参数

与此答案相关

 类似资料:
  • 下面的代码使用Google oauth2机制登录用户。我们需要在用户离线时处理用户日历的更新,所以我们最终需要“刷新令牌”。grantOfflineAccess()的结果是否返回刷新令牌(在下面,我可以看到response.code包含一个可能是刷新令牌的值)? 我如何获得一个刷新令牌,可以用来(服务器端)创建新的访问键,以便离线访问用户的谷歌日历?

  • 我已经用Jhipster创建了微服务(Spring Boot)应用程序(有网关微服务keybeat),还配置了keybeat。 一切正常,但我在注销应用程序中遇到了问题,当我从UI中点击注销API时,它只会从网关注销(不会破坏Keyclope会话) 注意:服务器没有在浏览器上保存任何cookie,除了JSESSIONID 我需要从KeyClope注销用户会话。为此,我浏览了以下链接 通过Keycl

  • 试图获取我的应用程序访问谷歌驱动器的刷新令牌。 我实现了指南中的所有步骤: 将get代码放入getTocket,总是得到只包含access_token而不包含refresh_token的响应: 会有什么问题? 我使用alredy客户端(clientId)访问youtube API(v2),在那里我得到了刷新令牌。我试图创建另一个clientId,但仍然无法获得refresh令牌。 我试图使用刷新令

  • 我试图允许用户通过谷歌API的帮助通过gmail登录。我可以登录,也可以检索个人信息,但不能检索,刷新和访问令牌,这是在成功登录的用户生成。因为我需要将详细信息发送到服务器,所以我如何检索它。 提前谢了。

  • 我有一个ASP。net core 3.1 MVC应用程序,使用OpenID连接Identity Server 4。我正在使用IdentityModel自动刷新应用程序中的访问令牌。配置如下所示: 我有一个控制器,它将从使用该标识服务器保护的下游应用编程接口中提取数据。我的MVC客户端请求范围api1和offline_access来获取刷新令牌。这些令牌存储在cookie中,因为服务上设置了。 一切

  • 我目前正在使用多个Quarkus服务和Keycloak RBAC开发一个PoC。工作起来就像一个魅力,很容易引导和开始实现功能。 但我遇到了一个我无法解决的问题。想象一下: null 使JWT的持续时间超过当前的30分钟,但这只是推迟了问题并打开了一些安全门 将用户的输入存储在本地存储器中,以便在令牌刷新后进行恢复(我们也会这样做,以避免浪费用户的工作) 在JS中“静默”刷新令牌,而不让用户知道。