reactjs - 使用 Oauth2、React、Node.js 和 Passport.js 通过 Google 登录按钮对用户进行身份验证的最佳做法是什么?
问题描述
我想在我的网站上有一个登录按钮,这样当用户点击它时,用户就可以使用他们的 Google 凭据。我想理想地使用 Express.js 和 Passport.js 执行身份验证服务器端。
我在服务器端实现了身份验证,但问题是我无法从网站向服务器发出 AJAX 请求以启动身份验证,因为Google 或 Oauth 不支持 CORS。所以我需要a href
在我的网站中使用元素来调用服务器身份验证端点。但是,我无法以这种方式捕获服务器响应。
如果我在客户端执行身份验证(我正在使用 React),我可以在 Redux 中存储登录状态并允许用户访问网站的资源。但是,当用户注销时,我需要确保服务器端点停止为同一用户提供服务,这感觉就像实施两次身份验证:客户端和服务器端。
此外,在客户端进行身份验证时,Google 会打开一个弹出窗口供用户进行身份验证,我认为这是更糟糕的用户体验,然后在服务器端进行身份验证时只是重定向。
我想知道在使用 Oauth2/Google 进行身份验证方面的最佳做法是什么。例如,stackoverflow.com 也有 Google 按钮,但只是进行重定向,没有任何弹出窗口,所以我猜他们想出了一种方法来执行服务器端身份验证并绕过 CORS 问题。
解决方案
您的身份验证应该在服务器端完成。下面是它的工作原理。
- 您拨打
fetch
或axios
拨打您的身份验证路由。 - 您的身份验证路由向 Google 的身份验证服务器发送请求。这在后端很重要,因为您需要提供您的
clientSecret
. 如果您将其存储在前端,它将使某人很容易找到该价值并破坏您的网站。 - Google 对用户进行身份验证,然后将一组令牌发送到您的回调 url 以供该用户使用(刷新、身份验证等)。然后,您将使用 auth 令牌进行任何额外的授权,直到它过期。
- 一旦过期,您将使用刷新令牌为该客户端获取新的授权令牌。这是一个完全不同的过程。
这是 Passport.js 的示例:https ://github.com/jaredhanson/passport-google-oauth2
编辑#1:
这是一个示例,其中包含与 Facebook 一起使用的过程的注释,它是相同的 OAuth 代码库: https ://github.com/passport/express-4.x-facebook-example/blob/master/server.js
推荐阅读
- c - 我在将文件中的输入读入数组结构时遇到问题
- bash - Bash:第一个路径,然后是第二个作为同一命令中第一个路径的相对路径
- oracle - 创建一个计算每月总收入的 PL/SQL 过程。总计必须按月打印
- node.js - 使用 NODE.js 对身份验证进行条带化并捕获费用
- android - room:如何在 Kotlin Android 中获取 Room 交易成功/失败的回调?
- android - BLE - 如果扫描什么也没找到,为什么我没有收到回调?
- html - 如何从 HTML 标签中提取数字
- java - 如何打印单词数组中的字符串,包括其重复项?
- jenkins - Jenkins - 无法使用 Groovy postbuild 插件发送松弛通知
- c - 递归方法不适用于二叉搜索树