如何将作用域 API 与 (GSI) Google 身份服务结合使用

How to use scoped APIs with (GSI) Google Identity Services

Google 最近给我发了一封电子邮件,内容如下:

One or more of your web applications uses the legacy Google Sign-In JavaScript library. Please migrate your project(s) to the new Google Identity Services SDK before March 31, 2023

有问题的项目使用 Google 驱动器 API 以及现在的旧版身份验证客户端。

迁移页面 (https://developers.google.com/identity/gsi/web/guides/migration) 上的 table 说:

Old New Notes
JavaScript libraries
apis.google.com/js/platform.js accounts.google.com/gsi/client Replace old with new.
apis.google.com/js/api.js accounts.google.com/gsi/client Replace old with new.

我目前在前端使用 gapi 来执行从 apis.google.com/js/api.js 加载的授权。根据 table 我需要用新库替换它。

我已经尝试过以下方式来验证和授权,就像我以前对 gapi 所做的那样:

window.google.accounts.id.initialize({
  client_id: GOOGLE_CLIENT_ID,
  callback: console.log,
  scope: "https://www.googleapis.com/auth/drive.file",
  discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"],
});

window.google.accounts.id.renderButton(ref.current, {
  size: "medium",
  type: "standard",
});

但是,当我尝试使用 Google 登录按钮进行身份验证时,scope 字段未被遵守,它不会要求用户授权请求的范围。它也不会 return 在回调的凭据响应中使用任何形式的访问令牌。

我不确定如何授权使用新库。

在新的Google身份服务中,认证时刻和授权时刻是分开的。这意味着 GIS 为网站提供了不同的 API 来调用这两个不同的时刻。您不能再将它们组合在一个 API 调用(和 UX 流程)中。

在身份验证时刻,用户只需登录或注册您的网站(利用 Google 共享的信息)。用户需要做出的唯一决定是他们是否要登录(或注册)。此时无需做出与授权相关的决定。

在身份验证时刻,用户将在所有网站上看到一致的一次点击或按钮 UX(因为隐式请求了相同的范围)。一致性导致更流畅的用户体验,这可能会进一步导致更多的使用。通过一致且优化的身份验证 UX(跨所有网站),用户将获得更好的联合登录体验。

用户登录后,当你真的想从Google数据服务加载一些数据时,你可以调用GIS授权API触发用户体验流程,让最终用户授予许可。这就是授权时刻。

目前(2021 年 8 月),仅发布了身份验证 API。如果您的网站只关心身份验证,您现在可以迁移到 GIS。如果您还需要授权API,则需要等待进一步通知。

要添加到当前的答案,现在有关于如何授权用户具有额外范围的文档。来自 Using the token model.

首先你需要初始化一个 TokenClient:

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  callback: (response) => {
    ...
  },
});

然后请求令牌:

client.requestAccessToken();

如果有人对迁移文档中提到的位置感兴趣,this section 的最后一段:

If your use case includes authorization, please read How user authorization works and Migrate to Google Identity Services to make sure your application is using the new and improved APIs.

虽然他们的文章非常详细和好,但我个人觉得他们对我来说有点太多了,所以我只是按照提到的第一篇文章而不关心迁移更简单。