1. 什么是Github第三方登录?
Github是全球最大的开发者社区,它主要有两种用户:开发者和Github企业版的用户。第三方登录是一种允许用户以自己的身份登录到另一个应用程序或网站的机制,由于实现难度较高,越来越多的开发者选择使用Github第三方登录,以在Web应用程序或网站上进行身份验证。
2. Node实现Github第三方登录的原理
要在Web应用程序或网站上使用Github第三方登录,您需要实现OAuth2协议。OAuth2协议是一种为Web应用程序或网站提供身份验证和授权的框架。OAuth2定义了一组标准流程,其中包括:
2.1 第一步:用户授权
在应用程序或网站上,用户被引导到Github,并被要求进行身份验证。如果用户已经登录到Github,他们将被要求授权应用程序或网站访问他们的Github资源。否则,他们将被要求首先登录到Github。
2.2 第二步:应用程序或网站获得访问令牌
一旦Github用户授权了应用程序或网站,应用程序或网站就会获得一个访问令牌。一个访问令牌是一个字符串,它允许应用程序或网站访问Github用户的资源。此令牌的有效期在Github中配置,并且可以选择由Github用户撤消。
2.3 第三步:应用程序或网站访问Github资源
应用程序或网站使用访问令牌来访问Github资源,如Github API。Github返回这些资源,如果访问令牌无效或已过期,则返回错误。
在Node中实现Github第三方登录时,我们可以使用第三方模块,如passport,以减少编写代码的工作量。Passport是一个Node.js中间件,它实现了授权过程,包括Github Oauth2协议的实现。
3. Github第三方登录的实现步骤
在本节中,我们将详细介绍如何在Node中实现Github第三方登录。
3.1 创建Github应用程序
要创建Github应用程序,请转到Github的开发者设置页面。单击“New OAuth App”按钮。在弹出的对话框中,输入应用程序名称和主页URL。应用程序名称是用户在Github上查看的应用程序的名称。主页URL是应用程序在使用该应用程序时要使用的URL。在“Authorization callback URL”字段中,输入回调URL。这是Github授权后,将返回到应用程序的URL。单击“Register application”按钮创建新应用程序。
在我们继续之前,您必须将Github应用程序的客户端ID和客户端密钥保存在安全的位置。客户端ID和客户端密钥是符合OAuth2标准的应用程序的凭证,只有具有这些凭证的应用程序才能访问Github API,并使用Github Oauth2协议进行身份验证和授权。
3.2 安装Passport模块
我们在Node.js中使用Passport模块来实现Github第三方登录。要安装Passport模块,请运行以下命令:
npm install passport passport-github2 express-session
上面的命令将安装passport、passport-github2和express-session模块。
3.3 配置Passport并实现Github第三方登录
Passport模块的第一步是配置它。在app.js文件的顶部,我们需要引入Passport模块、passport-github2和express-session、config和User模块。
const passport = require("passport");
const GitHubStrategy = require("passport-github2").Strategy;
const session = require("express-session");
const config = require("./config");
const User = require("./models/user");
接下来,我们需要设置Passport使用session中间件。应该在app.js中的调用Express应用程序中间件时这样做,如下所示:
app.use(session({ secret: config.session_secret, resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
注意,上面的代码中的config.session_secret是保存在磁盘上的随机字符串。这个字符串应该在应用程序的配置文件中配置。
接下来,我们需要为Passport设置Github策略。我们可以使用GithubStrategy类来设置策略,如下所示。
passport.use(
new GitHubStrategy(
{
clientID: config.github_client_id,
clientSecret: config.github_client_secret,
callbackURL: config.github_callback_url,
},
async (_accessToken, _refreshToken, profile, done) => {
// create or get user with profile info
}
)
);
上面的代码设置了Github策略。我们需要将客户端ID和客户端密钥包括在内,以允许Access令牌通过GithubOAuth2协议进行身份验证和授权。该callbackURL变量指示Github在成功授权后返回到应用程序的URL。
我们引用的第三个参数(async (_accessToken, _refreshToken, profile, done))是一个回调函数,当Github授权成功时被调用。在回调函数中,我们可以创建或获取已注册的用户,并将授权信息存储到数据库中。
3.4 Github授权成功后的回调URL
在Github授权成功后,应该将用户重定向回应用程序的另一个页面。我们可以使用Express路由器来实现,如下所示。
app.get("/auth/github", passport.authenticate("github", { scope: ["user:email"] }));
app.get(
"/auth/github/callback",
passport.authenticate("github", { failureRedirect: "/login" }),
(_req, res) => {
res.redirect("/");
}
);
上面的代码中,我们定义了一个/auth/github路由,用于将用户重定向到Github进行授权。此外,我们还定义了/auth/github/callback路由,该路由接收Github授权成功后的回调URL。然后,我们将用户重定向回主页。
4. 结论
本文详细介绍了如何在Node中实现Github第三方登录。我们在应用程序中使用了Passport和passport-github2模块来实现授权。此外,我们还提供了一些有关Github第三方登录的基本概念和OAuth2协议的解释。
Github第三方登录可以为Web应用程序或网站提供更好的身份验证和授权机制。它可以简化用户的登录过程,并提高Web应用程序或网站的安全性。我们希望本文对您有所帮助,如果您有任何疑问或建议,请在下面的评论区留言。