Node.js 什么';s Nodejs后端例程用于";在谷歌注册/登录;?

Node.js 什么';s Nodejs后端例程用于";在谷歌注册/登录;?,node.js,reactjs,google-oauth,google-login,Node.js,Reactjs,Google Oauth,Google Login,我正在使用一个Express Nodejs后端+React前端设置,并试图实现“使用Google注册/登录”功能,但我不知道在用户经过身份验证后在数据库中存储什么。在普通的电子邮件注册方法中,我在注册时将电子邮件+密码发送到后端,并在用户登录时检查电子邮件和密码是否匹配 然而,我不知道在数据库中存储什么,如果一个是谷歌注册的。我已经使用google实现了google auth的一部分,在前端,我的代码如下: import * as queryString from 'query-string';

我正在使用一个Express Nodejs后端+React前端设置,并试图实现“使用Google注册/登录”功能,但我不知道在用户经过身份验证后在数据库中存储什么。在普通的电子邮件注册方法中,我在注册时将电子邮件+密码发送到后端,并在用户登录时检查电子邮件和密码是否匹配

然而,我不知道在数据库中存储什么,如果一个是谷歌注册的。我已经使用google实现了google auth的一部分,在前端,我的代码如下:

import * as queryString from 'query-string';

const stringifiedParams = queryString.stringify({
  client_id: 'MY_CLIENT_ID'
  redirect_uri: 'http://localhost:8000/protected_home',
  scope: [
    'https://www.googleapis.com/auth/userinfo.email',
    'https://www.googleapis.com/auth/userinfo.profile'
  ].join(' '), // space seperated string
  response_type: 'code',
  access_type: 'offline',
  prompt: 'consent'
});

const googleLoginUrl = `https://accounts.google.com/o/oauth2/v2/auth?${stringifiedParams}`;

return (
  <a href={googleLoginUrl}>Login with Google</a>
)
import*作为“查询字符串”中的查询字符串;
常量stringifiedParams=queryString.stringify({
客户id:“我的客户id”
重定向_uri:'http://localhost:8000/protected_home',
范围:[
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile'
].join(“”),//空格分隔的字符串
响应类型:“代码”,
访问类型:“脱机”,
提示:“同意”
});
const googleLoginUrl=`https://accounts.google.com/o/oauth2/v2/auth?${stringifiedParams}`;
返回(
)
但是接下来呢?我已成功通过身份验证过程并重定向回受保护的主页。但这只意味着该用户是google用户,我应该在后端存储他们的信息,以表明该用户已在我的后端向该google帐户注册了一个帐户,这是什么信息


另外,是否可以将上面的逻辑移到后端?因为谷歌会像这样重定向回我的
redirect\u uri
http://localhost:8000/protected_home?code=CODE_IS_HERE,我需要使用浏览器来提取
code\u中的信息。因此,似乎不可能将登录逻辑移动到后端,任何解决方案?

您需要保存的是用户的唯一id、他的电子邮件或电话以及项目的其他一些用户数据。 这只是为了知道用户是否已经注册,或者知道后端的当前用户

从后端,您可以设置一个中间件来验证从google分配的令牌。 然后,您将获得用户的id,您可以从数据库中找到一个用户,如果存在,则该用户经过身份验证

  • 登录谷歌
  • 使用代码重定向
  • 将代码发送到后端
  • 后端将获得用户id和电子邮件的代码使用谷歌api
  • 保存用户并生成令牌
  • 将令牌发送回您的前端
  • 然后登录或注册过程完成

  • 基本上,您不应该从头开始编写它,因为有些库处理Oauth2:。除了在您自己的数据库中存储实际的详细信息外,它们应该处理以下所有步骤

    通常,在实施第三方oauth2身份验证时,有一些基本步骤:

  • 很好地理解Oauth2的工作原理
  • 从客户端重定向到服务器(react)
  • 通过重定向到Google请求授权
  • 获取授权码,该授权码将被添加到从google重定向回服务器的url中
  • 访问令牌(POST)的交换代码
  • 使用访问令牌从Google获取用户配置文件详细信息(POST)
  • 如果数据库中还不存在用户详细信息,请保存它们-理论上,您可以跳过这一部分
  • 创建会话/令牌并将其发送回客户端(React)-这是另一个重定向
  • 您也不能在服务器上存储任何用户详细信息,只需将从Google获得的令牌传递回您的React应用程序(客户端),但随后您需要检查它是否对服务器的每个请求都有效。这就是为什么创建自己的会话令牌并将其发送到客户端更简单的原因


    有更多的细节,因为这是一个非常重要的话题,但RFC6749应该填补空白。

    您可以在收到google auth服务的响应后将用户的电子邮件/手机保存在db中。这样,如果数据库中存在电子邮件,您可以确保用户是否已登录。此外,您可以要求用户保存此电子邮件的密码。这完全取决于你的业务逻辑是什么,以及你想用它做什么。所以身份验证登录将位于前端?我不建议这样做,身份验证登录应该在后端完成,前端应该只提供需要的完整数据。后端应该负责这类事情,比如登录、保存相关数据等等。@Rohitpalod这就是问题所在,为了更好地理解,我添加了一些更新。身份验证信息嵌入了redirect_uri,因此似乎无法将逻辑移到后端,因为我需要一个浏览器来提取该信息。但对于前端,用户在通过Google登录页面中的身份验证过程后,立即被重定向回
    redirect_uri
    ,看来我控制不了。如果按照你说的,我应该在用户登录后在我的数据库中进行验证,并在验证完成后触发重定向(我在Google和重定向之间插入一些操作)。谢谢你的解释,那么…我应该将用户重定向到中间ui(
    redirect\u uri
    page)等待3和4,当3和4完成后,是否将用户重定向到受保护的ui页面?我想我们应该直接把受保护的页面放到
    重定向\u uri
    页面对不起,我没有仔细阅读你的问题。那么您可以从重定向uri获取代码?在受保护的页面上,您需要将代码发送到后端,后端使用它获取用户id和电子邮件。您将这些内容保存到数据库中,生成带有用户id的jwt令牌并将其发送回前端。#2从节点应用重定向到服务器,重定向到服务器或重定向到客户端页面?已修复,我的意思是从您的客户端开始序列,您需要重定向,但我不太理解这一部分,#4您的意思是重定向uri应该是一个back