3种常见的登录实现方案,从传统到现代,让你的应用安全又便捷

1,599 阅读3分钟

实现用户登录是一个非常基本和重要的功能,常见的实现方案主要包括:

1. 基于 session 的登录

这是一种传统的登录方式,通过在服务器端保存 session 信息来实现用户登录。具体流程如下:

  • 用户输入用户名和密码,将其提交到服务器端
  • 服务器端验证用户名和密码是否正确,如果正确,就为该用户创建一个 session,并将 session ID 返回给客户端
  • 客户端将 session ID 保存在 cookie 中,以便下次请求时携带该信息
  • 每次客户端请求时,服务器端会验证 session ID 是否有效,如果有效,就将相应的用户信息返回给客户端

示例代码(基于 Express 框架):

// 登录
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  // 验证用户名和密码是否正确
  if (username === 'admin' && password === '123456') {
    // 创建 session
    req.session.user = { username };
    res.json({ code: 0, message: '登录成功' });
  } else {
    res.json({ code: -1, message: '用户名或密码错误' });
  }
});

// 获取用户信息
app.get('/user', (req, res) => {
  const user = req.session.user;
  if (user) {
    res.json({ code: 0, data: user });
  } else {
    res.json({ code: -1, message: '请先登录' });
  }
});

2. 基于 token 的登录

基于 token 的登录方式越来越流行,它将用户信息保存在 token 中,并使用加密算法对其进行签名,从而保证信息的安全性。具体流程如下:

  • 用户输入用户名和密码,将其提交到服务器端
  • 服务器端验证用户名和密码是否正确,如果正确,就为该用户生成一个 token,并将其返回给客户端
  • 客户端将 token 保存在 localStorage 或 cookie 中,以便下次请求时携带该信息
  • 每次客户端请求时,服务器端会验证 token 是否有效,如果有效,就将相应的用户信息返回给客户端

示例代码(基于 JWT 的实现):

// 登录
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  // 验证用户名和密码是否正确
  if (username === 'admin' && password === '123456') {
    // 生成 token
    const token = jwt.sign({ username }, 'secret', { expiresIn: '1h' });
    res.json({ code: 0, message: '登录成功', data: { token } });
  } else {
    res.json({ code: -1, message: '用户名或密码错误' });
  }
});

// 获取用户信息
app.get('/user', (req, res) => {
  const token = req.headers.authorization;
  if (token) {
    // 验证 token 是否有效
    jwt.verify(token, 'secret', (err, decoded) => {
      if (err) {
        res.json({ code: -1, message: '登录已过期,请重新登录' });
      } else { 
        res.json({ code: 0, data: decoded }); 
      } 
    });
  } else { 
    res.json({ code: -1, message: '请先登录' }); 
  } 
});
        

3. 第三方登录

第三方登录可以让用户使用其它平台的账号快速登录,常见的第三方平台包括微信、QQ、微博等。实现第三方登录需要与相应的平台进行交互,一般采用 OAuth2.0 协议进行认证和授权。具体流程如下:

  • 用户点击第三方登录按钮,跳转到第三方平台的授权页面

  • 用户在第三方平台授权页面上进行授权,同意使用其账号登录本应用

  • 第三方平台将授权码返回给本应用

  • 本应用使用授权码向第三方平台请求访问令牌

  • 第三方平台验证授权码是否有效,如果有效,就颁发一个访问令牌,并返回给本应用

  • 本应用使用访问令牌向第三方平台请求用户信息

  • 第三方平台验证访问令牌是否有效,如果有效,就返回用户信息给本应用

  • 本应用使用获取到的用户信息进行登录

示例代码(基于 passport 的实现):

// 配置第三方登录

passport.use(new WeixinStrategy({

  clientID: 'your_client_id',

  clientSecret: 'your_client_secret',

  callbackURL: '/auth/weixin/callback'

}, (accessToken, refreshToken, profile, done) => {

  // 使用 profile 中的信息进行登录

  done(null, profile);

}));

// 第三方登录

app.get('/auth/weixin', passport.authenticate('weixin'));

// 第三方登录回调

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

  res.redirect('/');

});

// 获取用户信息

app.get('/user', (req, res) => {

  if (req.isAuthenticated()) {

    res.json({ code: 0, data: req.user });

  } else {

    res.json({ code: -1, message: '请先登录' });

  }

});

以上是常见的登录实现方案,每种方案都有其优缺点,开发者需要根据具体需求选择合适的方案。