Google OpenID Connect:如何验证 id_token?

Posted

技术标签:

【中文标题】Google OpenID Connect:如何验证 id_token?【英文标题】:Google OpenID Connect: How to verify id_token? 【发布时间】:2017-05-18 14:41:11 【问题描述】:

我创建后端服务器,它从移动应用程序 (ios) 获取 ID 令牌。如何验证此令牌是否正常并且可以安全使用?

Google 关于验证令牌的官方文档:

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken

建议在本地验证 ID Token,无需向 Google 发送验证请求。是否可以像在文档中那样在本地检查 ID Token 中的某些字段,或者我是否应该向 Google 发送一些请求以验证令牌?

Google 文档提到了调试和验证 ID 令牌:

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123

但不建议在生产中使用它。我还考虑过使用 Access Token 和 Id Token 并首先验证 Access Token:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=

但它是否使验证客户凭据(移动应用程序、网络应用程序)的整个过程更加安全?

【问题讨论】:

Validate Google Id Token的可能重复 【参考方案1】:

首先让我先说我不为 Google 工作。但是,自 2012 年以来,我一直在使用 Google Oauth2 进行开发。不久前,我问了一位 Google 员工这个问题。

他的建议是,如果您有一个刷新令牌,只需请求一个新的访问令牌。如果它不好,服务器将返回一个错误。如果您有访问令牌,则发送请求,如果它不正确,服务器将返回错误。

首先验证它并没有什么意义,您只需为每个请求发送两个请求到服务器。从长远来看,您要做的只是防止一小部分请求出现错误。

我从来没有为 id 令牌烦恼过。 Id 令牌是一个 jwt,所以我认为您应该可以打开它。

更新

您应该咨询Verifiy the integrity of the id token。

您也可以自己进行一些检查。 id 令牌是jwt,如果你解密它,你会得到或calling the tokeninfo endpoint


  "iss": "https://accounts.google.com",
  "azp": "407408718192.apps.googleusercontent.com",
  "aud": "407408718192.apps.googleusercontent.com",
  "sub": "11720055326",
  "at_hash": "HQVaIRLqmsjaTt8KoOIQ",
  "name": "Linda Lawton",
  "picture": "https://lh3.googleusercontent.com/a-/AAuE7mDuIWqXzrrp-65cIhXSD2HjCI8WYsWHR0fDx5_wQPY=s96-c",
  "given_name": "Linda",
  "family_name": "Lawton",
  "locale": "en",
  "iat": 1567751,
  "exp": 1567755

iss 应该是https://accounts.google.com aud 将是您的应用程序的客户端 ID 7408718192.apps.googleusercontent.com at_hash 可能还有一些方法可以验证这一点,但我没有打扰

【讨论】:

感谢您的回答,但这并不是我所需要的。使用访问令牌的情况非常明确:我发送 access_token 来获取一些数据,并且每次请求 Google 都会验证我的 access_token。但是,当我获得 ID 令牌时,我不必向 Google 发送任何请求,因为我拥有所有详细信息。但是,我相信您的回答会对这个问题的其他访问者有所帮助。 也许我没有理解你的问题。 Google 建议您在本地检查令牌以确保其有效。你为什么不听从他们的建议?我的意思是检查访问令牌和令牌信息只会增加您可能不需要的额外负载。 是的,你在本地检查 JWT 令牌是对的,而且我认为这是 JWT 令牌的概念,用于限制额外的请求(对提供者或数据库)。但是,我想知道使用 HTTPS POST 请求处理通过“开放”API 发送到后端的 ID 令牌是否安全。 我认为这是正确的答案。我认为像 aud 这样的 JWT 令牌字段的验证很重要,并且使使用 JWT 令牌更加安全。所以不要忽略这些类型的字段。 那么如何验证 id_token 呢?您是否需要公钥来验证此类令牌?如果是,从哪里获得?

以上是关于Google OpenID Connect:如何验证 id_token?的主要内容,如果未能解决你的问题,请参考以下文章

Google 登录或 OpenID Connect

使用不同的 redirect_uri 和 openid.realm 参数从 Google OpenID 2.0 迁移到 OpenID Connect

验证 Google OpenID Connect JWT ID 令牌

验证 Google OpenID Connect JWT ID 令牌

Facebook 的 OpenID Connect 配置

OpenID Connect 提供商 [关闭]