【问题标题】:Why google Oauth verifyIdToken (javascript nodejs version) doesn't use client-secret?为什么google Oauth verifyIdToken(javascript nodejs版本)不使用客户端秘密?
【发布时间】:2017-05-09 08:30:07
【问题描述】:

我正在为 SPA js+nodejs 应用程序测试 google singin。 我已经添加了这个:

<script src="https://apis.google.com/js/platform.js" async defer></script>

还有这些:

<meta name="google-signin-client_id" content="YOUR_CLIENT_ID.apps.googleusercontent.com">
<div class="g-signin2" data-onsuccess="onSignIn"></div>

在 html5/js 客户端。 遵循本指南:

https://developers.google.com/identity/sign-in/web/sign-in

当用户进行身份验证时,库获取令牌并将其传递给服务器,如下所述:

https://developers.google.com/identity/sign-in/web/backend-auth

在服务器端(nodejs)使用此函数验证令牌:

client.verifyIdToken(
    token,
    CLIENT_ID,
    // Or, if multiple clients access the backend:
    //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3],
    function(e, login) {
      var payload = login.getPayload();
      var userid = payload['sub'];
      // If request specified a G Suite domain:
      //var domain = payload['hd'];
    });

我的问题是:client_secret 什么时候使用?因为我使用 CLIENT_ID 前端从谷歌获取身份验证令牌,所以我使用 CLIENT_ID 服务器端进行令牌验证。我认为可以使用仅在服务器端知道的 client_secret(即 SECRET)验证令牌,以便获取令牌的其他人无法验证该用户。 我错过了什么?

【问题讨论】:

  • 客户端密码仅在您从后端服务器请求访问来自 Google 的其他数据时使用,例如离线访问用户的联系人、日历或云端硬盘数据。服务器使用该密钥从客户端应用程序交换身份验证代码以获取访问令牌以检索经过身份验证的数据。在您的情况下,听起来您只是将包含在 ID 令牌(签名的 JWT)中的基本用户数据传递到您的服务器以验证用户的身份。如果您不需要从服务器访问任何经过身份验证的 Google 资源,则不需要访问令牌,也不需要密钥。
  • 这里是解释仅身份验证用例的博客文章:android-developers.googleblog.com/2016/01/… 和 API 访问用例的授权:android-developers.googleblog.com/2016/02/…

标签: node.js google-oauth google-signin google-api-nodejs-client


【解决方案1】:

我相信我有答案,

请看这里:https://firebase.google.com/docs/auth/admin/verify-id-tokens

它解释了如何自己检查 JWT 的签名(如果你愿意的话),这也是 google-auth-library 正在做的事情。在库中,在 oauth2client.js 中搜索 verifySignedJwtWithCertsAsync()。 Google 在联合登录过程中使用自己的私钥处理 JWT 的签名。当 JWT 返回给您并发送到 auth 库时,它已经被签名了。这很棒,因为您永远不必触摸私钥。它安全地存储在 Google 中,您只需让 Google 处理该部分即可。然后,当您将 JWT 发送到您的服务器时,标头中的密钥 id 声明让 auth 库知道使用哪个公钥来解码它。如果公钥解码失败,则认证失败。

最后,确保 ID 令牌由与令牌的 Kid 声明对应的私钥签名。从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 获取公钥并使用 JWT 库来验证签名。使用来自该端点的响应的 Cache-Control 标头中的 max-age 的值来了解何时刷新公钥。

如果以上所有验证都成功,则可以将ID令牌的主题(子)作为对应用户或设备的uid。

【讨论】:

    【解决方案2】:

    您创建的客户端似乎是公共客户端,客户端密码用于私人客户端。

    编辑:对不起,我使用了私人客户一词而不是机密客户。 基本上我们在 Oauth2 中有两种类型的客户端

    1. 公共客户端:- 这些是不需要客户端密码的客户端。

    2. 私人客户端:- 这些客户端有一个客户端密码。

    我不能给你一个非常确定的答案,为什么你看不到你的客户秘密,因为我以前没有使用过这些特定的库,但是 在我看来,您可能创建了一个公共客户而不是机密客户。

    【讨论】:

    猜你喜欢
    • 2017-06-02
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多