单一流程:通过 Google oAuth 登录用户并授予离线/服务器访问权限?

Dav*_*man 9 javascript node.js google-oauth google-api-nodejs-client google-signin

我正在尝试为具有 Node.js 后端的 Web 应用程序实现 Google 登录和 API 访问。Google 的文档使用platform.js客户端和google-auth-library服务器端的组合提供了两个选项:

  1. Google Sign-In with back-end auth,用户可以通过它使用他们的 Google 帐户登录我的应用程序。(auth2.signIn()在客户端和verifyIdToken()服务器上。)
  2. 用于服务器端应用程序的 Google 登录,我可以通过它授权服务器代表我的用户直接连接到 Google。(auth2.grantOfflineAccess()在客户端上,它返回一个我可以getToken()在服务器上传递的代码。)

我需要两者:我想通过 Google 登录验证用户;而且,我想建立服务器授权,因此它可以同时代表用户的工作。

我无法弄清楚如何使用单个身份验证流程来做到这一点。我能得到的最接近的是按顺序执行这两项操作:首先使用 对用户进行身份验证signIn(),然后(根据需要)通过 进行第二次传递grantOfflineAccess()。这是有问题的:

  1. 用户现在必须背靠背进行两次身份验证,这很尴尬,而且看起来我的应用程序出了点问题。
  2. 为了避免与弹出窗口拦截器发生冲突,我不能将这两个流放在彼此之上;我必须进行第一次身份验证,然后提供一个按钮来开始第二次身份验证。这太尴尬了,因为现在我必须解释为什么第一个还不够。

理想情况下,有一些变体signIn()将离线访问添加到初始身份验证流程中,并将代码与通常的令牌一起返回,但我什么也没看到。帮助?

(编辑:我在其他地方收到的一些建议是只实现流程 #2,然后使用安全 cookie 存储某种用户标识符,我在每个请求中检查用户帐户。我可以看到这可以正常工作,但基本上意味着我正在运行自己的登录系统,这似乎会增加我在关键系统中引入错误的机会。)

Rup*_*oti 1

在身份验证(登录)时,您需要添加“离线”访问类型(默认为在线),这样您将获得一个刷新令牌,您可以使用该令牌稍后获取访问令牌,而无需进一步的用户同意/身份验证。您稍后不需要授予离线权限,只需在登录期间通过添加离线 access_type 即可授予离线权限。我不知道 platform.js 但使用了“passport” npm module 。我还使用了“googleapis”npm 模块/库,这是 Google 官方的。

https://developers.google.com/identity/protocols/oauth2/web-server

https://github.com/googleapis/google-api-nodejs-client

检查这个: https: //github.com/googleapis/google-api-nodejs-client#generate-an-authentication-url

编辑:您有一个服务器端,您需要代表用户工作。您还想使用 Google 进行登录。您只需要 #2 Google Sign-in 用于服务器端应用程序,为什么要同时考虑 #1 和 #2 选项。

根据您的要求,我可以认为#2是正确的方法。如果您只想登录,请使用电子邮件和个人资料(openid connect)等基本范围来识别用户。如果您希望用户委派权限(例如您希望在用户日历中自动创建事件),只需在登录期间添加离线 access_type 即可。您只能对注册用户使用登录,对新用户使用离线访问。

以上是单个身份验证流程。