Google 身份服务 - 使用 Google 登录与 Google API 的用户授权之间的关系

Kol*_*ban 5 oauth google-oauth openid-connect

我正在研究有关“Google Identity Services”的 Google 文档,似乎看到了两个故事。其中一个称为“使用 Google 登录”,它提供了一个有吸引力的按钮,用户可以使用其 Google 帐户登录。另一个是 Google 身份服务授权,它授予访问令牌以进行 API 调用。

我缺少的是这两个概念/SDK/功能之间是否存在关系。我的想法是,我想要在我的网页上有一个漂亮的按钮,我可以用它来登录(ala Sign in With Google),并且我希望单击该按钮来给我一个访问令牌,我可以用它来调用 Google API 。我似乎发现它们是独立且离散的概念,它们之间没有明显的关系。那是对的吗?

参考

2022-06-26:根据 Blunt 的帖子,我尝试添加提示,但这似乎没有什么区别。这是我一直在使用的代码。首先,加载测试的index.html:

<!DOCTYPE html>
<html>
<body>

    <script src="https://accounts.google.com/gsi/client"></script>
    <script src="./index.js"></script>
    <div id="g_id_onload" data-client_id="XXX.apps.googleusercontent.com"
        data-callback="handleToken" data-auto_prompt="false">
    </div>
    <div class="g_id_signin" data-type="standard" data-size="large" data-theme="outline" data-text="sign_in_with"
        data-shape="rectangular" data-logo_alignment="left">
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

以及在index.js中加载的JavaScript

const clientId = "XXX.apps.googleusercontent.com"
function handleToken(x) {
  debugger;
  const client = google.accounts.oauth2.initTokenClient({
    client_id: clientId,
    hint: "myemailaddress",
    scope: 'https://www.googleapis.com/auth/calendar.readonly',
    callback: (response) => {
      debugger;
    },
  });
  client.requestAccessToken();
}
Run Code Online (Sandbox Code Playgroud)

我发现我在网页中得到了所需的按钮...我单击该按钮,系统提示我登录 Google,然后handleToken到达函数中的调试器语句(第一个)。代码继续运行,然后系统提示我再次登录 Google。我希望第一次登录就足够了,并且可以以某种方式保留授权的上下文。

Blu*_*son 6

在新的 Google Identity Service 中,身份验证(登录)和授权(访问 api)是分开的,但并不完全不同。

我有一篇文章解释了这一点,以及纯客户端解决方案的参考实现。npm install gothic将为您提供参考实现。

但详细信息如下:

(1) 使用 Google 登录后会出现一个漂亮的按钮。登录提供以 JWT 编码的用户信息。但这些都没有提供访问令牌。

(2) 要获得授权,您需要驱动第二个顺序进程。为了加快此过程,您可以使用登录过程中的电子邮件地址作为hint授权库的可选参数,但用户第一次访问它时,他们仍然需要经历显式授权过程,具体取决于 api 的(范围)您需要访问。

关于授权,有两种模型:

(1)基于代币。这是纯客户端版本。这样,您最终可以向库提供 clientId、API 密钥、发现 uri 和范围,并获得一个 1 小时的令牌,该令牌授权使用您的应用程序所需的 API。正如我所提到的,这需要第一次向用户明确提示,此后无需点击。但是您需要每小时或在每个页面刷新时更新该令牌。

(2) 基于代码。这要求您的应用程序也有一个服务器端。在此模型中,您的客户端从 Google 获取代码,并将其交给您的服务器。您的服务器将其交换为访问令牌和刷新令牌,然后使用刷新令牌来获取新的访问令牌。

服务器端基于代码的模型更安全,并且最终可以提供更好的用户体验,但它的架构当然更复杂。

如果您有想要运行的特定代码,请随时分享,我们可以提供帮助。