终于登录上来了,求Nodejs相关登录验证最佳实践

终于登录上来了,求Nodejs相关登录验证最佳实践

我花了半个小时用在登录的时间上。。。。。。 详细描述:以前用github账号登录过一次,这次登录的时候照样用github登录但是却让关联账号(还有个选择忘了),果断关联不上啊,整了半天,然后看到有了提示是让去github填什么邮件地址,然后去填了就好了

7 回复

当然可以!以下是一个关于Node.js相关登录验证的最佳实践示例。我们将使用Passport.js库来实现GitHub OAuth登录,并提供一些基本的错误处理和用户体验优化。

示例代码

首先,确保你已经安装了必要的依赖:

npm install express passport passport-github2 cookie-parser body-parser dotenv

接下来,创建一个简单的Express应用,并配置Passport.js以支持GitHub OAuth登录:

文件结构

/project-root
│
├── .env
├── app.js
└── routes.js

.env 文件

GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
SESSION_SECRET=your_session_secret
PORT=3000

app.js

const express = require('express');
const passport = require('passport');
const GitHubStrategy = require('passport-github2').Strategy;
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
require('dotenv').config();

const app = express();

// Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static('public'));

// Passport configuration
passport.use(new GitHubStrategy({
    clientID: process.env.GITHUB_CLIENT_ID,
    clientSecret: process.env.GITHUB_CLIENT_SECRET,
    callbackURL: `${process.env.BASE_URL}/auth/github/callback`
  },
  (accessToken, refreshToken, profile, cb) => {
    // Here you would typically save the user to your database and return the user object
    return cb(null, profile);
  }
));

passport.serializeUser((user, done) => {
  done(null, user);
});

passport.deserializeUser((obj, done) => {
  done(null, obj);
});

app.use(passport.initialize());
app.use(passport.session());

// Routes
require('./routes')(app, passport);

// Start server
app.listen(process.env.PORT, () => {
  console.log(`Server running on port ${process.env.PORT}`);
});

routes.js

module.exports = function(app, passport) {
  app.get('/auth/github', 
    passport.authenticate('github'));

  app.get('/auth/github/callback', 
    passport.authenticate('github', { failureRedirect: '/login' }),
    (req, res) => {
      res.redirect('/');
    });

  app.get('/logout', (req, res) => {
    req.logout();
    res.redirect('/');
  });

  app.get('/', (req, res) => {
    res.send(`
      <h1>Welcome!</h1>
      <a href="/auth/github">Login with GitHub</a>
    `);
  });
};

解释

  1. 环境变量:使用.env文件存储敏感信息,如客户端ID、客户端密钥和会话密钥。
  2. Passport.js:通过配置GitHub策略来处理OAuth登录流程。
  3. 路由:定义了GitHub登录和回调的路由,并处理登录后的重定向。
  4. 中间件:使用cookie-parserbody-parser来解析请求体和Cookie。

总结

这个示例展示了如何使用Passport.js和GitHub OAuth来实现一个简单的登录系统。你可以根据需要扩展此示例,例如添加用户数据库存储、密码重置等功能。希望这能帮助你更好地理解和实现Node.js中的登录验证功能。


貌似cnode登陆是一大问题呀

这是个大坑

需要关联GitHub账号。。。

不明白,我的很正常,如果没登录就跳到 github 认证了。

详细点?

对于“终于登录上来了,求Nodejs相关登录验证最佳实践”的问题,可以总结为如何实现一个安全且方便的登录验证机制。以下是使用OAuth(以GitHub为例)进行用户认证的最佳实践示例。

示例代码

首先,你需要安装必要的库:

npm install express passport passport-github2 cookie-session

接着,创建一个简单的Express应用,并配置好Passport中间件:

const express = require('express');
const passport = require('passport');
const GitHubStrategy = require('passport-github2').Strategy;
const cookieSession = require('cookie-session');

const app = express();

app.use(cookieSession({
  name: 'session',
  keys: ['secret']
}));

app.use(passport.initialize());
app.use(passport.session());

// 配置Passport使用GitHub策略
passport.use(new GitHubStrategy({
    clientID: 'your-github-client-id',
    clientSecret: 'your-github-client-secret',
    callbackURL: 'http://localhost:3000/auth/github/callback'
  },
  function(accessToken, refreshToken, profile, cb) {
    // 这里处理用户数据并返回给回调
    return cb(null, profile);
  }
));

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

// 登录路由
app.get('/auth/github', 
  passport.authenticate('github'));

app.get('/auth/github/callback', 
  passport.authenticate('github', { failureRedirect: '/login' }),
  function(req, res) {
    // 成功认证后跳转到主页
    res.redirect('/');
  });

app.get('/', (req, res) => {
  if (!req.user) {
    res.redirect('/auth/github');
  } else {
    res.send(`Hello ${req.user.username}!`);
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

解释

  1. OAuth授权:通过GitHub登录,用户将被重定向到GitHub的授权页面,在那里他们可以选择是否授权你的应用访问他们的账户信息。
  2. 回调处理:一旦用户同意授权,GitHub会回调指定的URL,传递授权令牌。服务器端使用这个令牌获取用户的个人信息。
  3. 会话管理:使用cookie-session库来管理用户的会话状态。这样,用户登录后无需再次输入凭据。
  4. 用户验证与序列化:Passport提供了用户验证和会话管理功能。serializeUserdeserializeUser方法确保用户会话能够在不同请求间保持一致。

这种方式既安全又便捷,适合在生产环境中使用。

回到顶部