在 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 访问令牌。
并且它可以采用如下所示的回调函数:
参考:method-getAuthToken使用清单指定的 OAuth2 访问令牌调用,如果出现错误,则使用未定义的令牌调用。
如果你指定回调参数,它应该是一个看起来像这样的函数:
function(string token) ...;
【讨论】:
我只是遇到了同样的问题,并且正在考虑同样的解决方案,感谢 Grokify 将我指向跨客户端文档以上是关于在 Chrome 扩展程序中使用 Google 帐户进行服务器端身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Chrome 扩展程序 browser_action 中登录 Google?