在 Chrome 扩展程序中使用 Google 帐户进行服务器端身份验证

Posted

技术标签:

【中文标题】在 Chrome 扩展程序中使用 Google 帐户进行服务器端身份验证【英文标题】:Server-side authentication using Google accounts in a Chrome extension 【发布时间】:2018-11-05 06:20:54 【问题描述】:

我有一个 Web 应用程序,它当前使用 OAuth2 来验证使用其 Google 帐户的用户。流程非常标准:用户登录 Google,Web 应用获取回调,检索用户身份并将其存储在会话中。

现在我需要创建一个随附的 Chrome 扩展程序。此扩展需要访问下面的 Web 应用程序,因此需要针对此应用程序进行身份验证。我使用the official documentation 配置了我的扩展,但在实验过程中,我意识到这不是我需要的。由于它使用 OAuth2 隐式流,它不会返回可以在服务器端验证的令牌。此流程仅适用于在客户端使用 Google API,这不是我的用例。本文档(以及我在 Web 上找到的几乎所有其他内容)侧重于两种可能的情况:

    我们希望在扩展端访问 Google API (chrome.identity.getAuthToken())。 我们希望使用替代的 OAuth2 服务 (chrome.identity.launchWebAuthFlow()) 进行身份验证。

但是,就我而言,我想使用 Google 帐户对用户进行身份验证,但在我的 Web 应用程序的服务器端处理令牌。我可以在此处使用选项 2,但创建自己的“非 Google 身份验证服务”只是对 Google 身份验证服务的包装,只是为了能够在服务器端进行身份验证,这对我来说“感觉不对” .

选项 2 真的是唯一的方法吗,还是有更简单的方法?

我还看到有人推荐使用tokeninfo 端点来验证令牌,但我发现很难确保这确实是一种“官方”且安全的方式。

【问题讨论】:

【参考方案1】:

要检索可以在应用程序的两个部分(扩展程序和服务器)上使用的访问令牌,您应该请求 Google 跨客户端访问令牌。这允许您在一个项目中注册您的两个应用程序(两个客户端 ID)并共享一个访问令牌。

Google 在此处对此进行了描述和讨论:

文档:Google Identity Platform: Cross-client Identity 视频:Google Drive SDK: Cross-client authorization

粗略的步骤是:

    您将需要两个 clientId,一个用于您的扩展程序,另一个用于您的服务器应用程序 将两个 clientId 添加到单个项目中 从您的扩展中检索跨客户端访问令牌 通过 HTTPS 将其发送到您的服务器

要在 Chrome 中执行此操作,您似乎需要使用回调函数调用 chrome.identity.getAuthToken(),将令牌发送到您的网络应用程序。

参考在chrome.identity.getAuthToken() 上说以下内容:

chrome.identity.getAuthToken(object details, function callback)

使用 manifest.json 的 oauth2 部分中指定的客户端 ID 和范围获取 OAuth2 访问令牌。

并且它可以采用如下所示的回调函数:

使用清单指定的 OAuth2 访问令牌调用,如果出现错误,则使用未定义的令牌调用。

如果你指定回调参数,它应该是一个看起来像这样的函数:

function(string token) ...;

参考:method-getAuthToken

【讨论】:

我只是遇到了同样的问题,并且正在考虑同样的解决方案,感谢 Grokify 将我指向跨客户端文档

以上是关于在 Chrome 扩展程序中使用 Google 帐户进行服务器端身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Chrome 扩展程序 browser_action 中登录 Google?

在 chrome 扩展中使用频道 google 应用引擎

将 jQuery 与 Google Chrome 应用程序而非 Chrome 扩展程序一起使用

从Chrome扩展程序访问Google文档

Google禁止从第三方网站安装Chrome扩展程序

如何链接到 Google Chrome 扩展程序的本地图像?