• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    使用Node.js实现GitHub登录功能

    发布者: 涵韵 | 发布时间: 2025-6-16 07:39| 查看数: 159| 评论数: 0|帖子模式

    在 Node.js 中实现 GitHub 登录功能,通常需要使用 OAuth 2.0 协议。GitHub 提供了 OAuth 认证机制,用户可以通过 GitHub 登录授权应用访问其数据。以下是实现 GitHub 登录的步骤。
    我们将使用
    1. passport
    复制代码
    中间件和
    1. passport-github2
    复制代码
    策略来简化 OAuth 认证流程。

    1. 安装所需的 npm 包

    首先,创建一个新的 Node.js 项目并安装必需的依赖:
    1. npm init -y
    2. npm install express passport passport-github2 express-session dotenv
    复制代码

      1. express
      复制代码
      : 用于构建 web 应用。
      1. passport
      复制代码
      : 用于认证的中间件。
      1. passport-github2
      复制代码
      : GitHub 的 OAuth 认证策略。
      1. express-session
      复制代码
      : 用于管理会话。
      1. dotenv
      复制代码
      : 用于管理环境变量。

    2. 配置 GitHub OAuth 应用

    在 GitHub 上创建 OAuth 应用并获取
    1. Client ID
    复制代码
    1. Client Secret
    复制代码
    ,步骤如下:

    • 访问 GitHub OAuth Applications
    • 点击 "New OAuth App" 按钮。
    • 填写以下信息:

      • Application Name:应用名称(例如:"MyApp")。
      • Homepage URL:应用主页的 URL(例如:
        1. http://localhost:3000
        复制代码
        )。
      • Authorization callback URL:回调 URL(例如:
        1. http://localhost:3000/auth/github/callback
        复制代码
        )。

    • 点击 Register Application
    你会获得
    1. Client ID
    复制代码
    1. Client Secret
    复制代码
    ,这些需要在代码中使用。

    3. 配置 .env 文件

    在项目根目录下创建一个
    1. .env
    复制代码
    文件,存储 GitHub 的
    1. Client ID
    复制代码
    1. Client Secret
    复制代码
    1. GITHUB_CLIENT_ID=your-client-id
    2. GITHUB_CLIENT_SECRET=your-client-secret
    3. GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback
    4. SESSION_SECRET=your-session-secret
    复制代码
    4. 创建 app.js 文件并实现 OAuth 登录

    创建
    1. app.js
    复制代码
    文件并编写以下代码:
    1. const express = require('express');
    2. const passport = require('passport');
    3. const session = require('express-session');
    4. const dotenv = require('dotenv');
    5. const GitHubStrategy = require('passport-github2').Strategy;

    6. dotenv.config();

    7. const app = express();
    8. const port = 3000;

    9. // 设置会话中间件
    10. app.use(session({
    11.     secret: process.env.SESSION_SECRET,
    12.     resave: false,
    13.     saveUninitialized: true
    14. }));

    15. // 初始化 Passport
    16. app.use(passport.initialize());
    17. app.use(passport.session());

    18. // 配置 Passport 使用 GitHub OAuth 2.0 策略
    19. passport.use(new GitHubStrategy({
    20.     clientID: process.env.GITHUB_CLIENT_ID,
    21.     clientSecret: process.env.GITHUB_CLIENT_SECRET,
    22.     callbackURL: process.env.GITHUB_CALLBACK_URL
    23. }, function(accessToken, refreshToken, profile, done) {
    24.     // 在此处可以将 GitHub 用户信息存储到数据库
    25.     return done(null, profile);
    26. }));

    27. // 序列化用户到 session 中
    28. passport.serializeUser(function(user, done) {
    29.     done(null, user);
    30. });

    31. // 反序列化用户
    32. passport.deserializeUser(function(user, done) {
    33.     done(null, user);
    34. });

    35. // 路由:跳转到 GitHub 登录页面
    36. app.get('/auth/github', (req, res) => {
    37.     passport.authenticate('github', { scope: ['user:email'] })(req, res);
    38. });

    39. // 路由:GitHub 登录回调
    40. app.get('/auth/github/callback', (req, res) => {
    41.     passport.authenticate('github', { failureRedirect: '/' })(req, res, function() {
    42.         res.redirect('/profile');
    43.     });
    44. });

    45. // 路由:用户个人资料页面
    46. app.get('/profile', (req, res) => {
    47.     if (!req.isAuthenticated()) {
    48.         return res.redirect('/');
    49.     }
    50.     res.json(req.user);  // 返回用户信息
    51. });

    52. // 路由:退出登录
    53. app.get('/logout', (req, res) => {
    54.     req.logout(function(err) {
    55.         res.redirect('/');
    56.     });
    57. });

    58. // 路由:首页
    59. app.get('/', (req, res) => {
    60.     if (req.isAuthenticated()) {
    61.         return res.redirect('/profile');
    62.     }
    63.     res.send('<a href="/auth/github" rel="external nofollow" >Login with GitHub</a>');
    64. });

    65. // 启动服务器
    66. app.listen(port, () => {
    67.     console.log(`Server is running at http://localhost:${port}`);
    68. });
    复制代码
    代码解释:

    • GitHub OAuth 配置:通过
      1. passport-github2
      复制代码
      策略配置 GitHub OAuth 认证,使用
      1. Client ID
      复制代码
      1. Client Secret
      复制代码
      进行认证。
      1. /auth/github
      复制代码
      :此路由用于触发 GitHub 登录流程,用户点击链接后,会被重定向到 GitHub 登录页面。
      1. /auth/github/callback
      复制代码
      :GitHub 会回调此路由,将认证信息传递给应用。如果认证成功,用户信息将会存储在
      1. req.user
      复制代码
      中,并跳转到
      1. /profile
      复制代码
      页面。
      1. /profile
      复制代码
      :如果用户已经登录,将显示用户的 GitHub 个人资料。
      1. /logout
      复制代码
      :用于用户退出登录。
      1. passport.serializeUser
      复制代码
      1. passport.deserializeUser
      复制代码
      :这两个方法将用户信息存储到会话中。

    5. 启动应用并测试

    启动 Node.js 应用:
    1. node app.js
    复制代码
    打开浏览器,访问
    1. http://localhost:3000
    复制代码

    点击 Login with GitHub,GitHub 将提示你授权应用。
    完成授权后,你将被重定向到
    1. /profile
    复制代码
    页面,显示你的 GitHub 用户信息。

    6. 处理认证失败和错误(可选)

    你可能需要在认证失败时提供合适的反馈,可以在
    1. passport.authenticate
    复制代码
    中设置
    1. failureRedirect
    复制代码
    1. app.get('/auth/github/callback', (req, res) => {
    2.     passport.authenticate('github', { failureRedirect: '/' })(req, res, function() {
    3.         res.redirect('/profile');
    4.     });
    5. });
    复制代码
    如果认证失败,用户将被重定向到首页。

    7. 保护路由(可选)

    你可以通过
    1. req.isAuthenticated()
    复制代码
    来检查用户是否已认证,如果没有认证,则重定向到登录页面。
    1. app.get('/profile', (req, res) => {
    2.     if (!req.isAuthenticated()) {
    3.         return res.redirect('/');
    4.     }
    5.     res.json(req.user);  // 返回用户信息
    6. });
    复制代码
    总结

    通过上述步骤,你已经成功地在 Node.js 中实现了 GitHub 登录。使用 Passportpassport-github2 策略简化了 OAuth 认证流程。你可以根据需要扩展功能,比如存储用户数据、处理登录状态等。
    到此这篇关于使用Node.js实现GitHub登录功能的文章就介绍到这了,更多相关Node.js GitHub登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/javascript/339800uv6.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表