优秀的编程知识分享平台

网站首页 > 技术文章 正文

登录鉴权的三种方式:token、jwt、session简洁例子

nanyue 2024-09-21 19:52:17 技术文章 5 ℃

登录鉴权是 Web 应用中非常重要的一环,常见的三种鉴权方式是 token、JWT 和 session,下面对它们进行实战分享。

1:Token 鉴权

Token 鉴权是基于 Token 的一种鉴权方式,通常使用 RESTful API 来进行数据交互。以下是一个简单的实现示例:

前端代码:

javascriptCopy codefetch('/api/login', {
  method: 'POST',
  body: JSON.stringify({
    username: 'user',
    password: 'password'
  }),
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => response.json())
.then(data => {
  localStorage.setItem('token', data.token);
})
.catch(error => console.error(error));

后端代码:

javascriptCopy codeconst jwt = require('jsonwebtoken');
const express = require('express');
const app = express();

app.post('/api/login', (req, res) => {
  const { username, password } = req.body;
  if (username === 'user' && password === 'password') {
    const token = jwt.sign({ username }, 'secretKey', { expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
});

app.get('/api/data', (req, res) => {
  const token = req.headers.authorization.split(' ')[1];
  jwt.verify(token, 'secretKey', (err, decoded) => {
    if (err) {
      res.status(401).json({ error: 'Unauthorized' });
    } else {
      res.json({ data: 'Data accessed with Token' });
    }
  });
});

app.listen(3000, () => console.log('Server started'));

2:JWT 鉴权

JWT 鉴权是基于 JWT(JSON Web Token)的一种鉴权方式,它可以将用户信息加密成一个 Token,用于验证用户身份。以下是一个简单的实现示例:

前端代码:

javascriptCopy codefetch('/api/login', {
  method: 'POST',
  body: JSON.stringify({
    username: 'user',
    password: 'password'
  }),
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => response.json())
.then(data => {
  localStorage.setItem('jwtToken', data.jwtToken);
})
.catch(error => console.error(error));

后端代码:

javascriptCopy codeconst jwt = require('jsonwebtoken');
const express = require('express');
const app = express();

app.post('/api/login', (req, res) => {
  const { username, password } = req.body;
  if (username === 'user' && password === 'password') {
    const payload = { username };
    const jwtToken = jwt.sign(payload, 'secretKey', { expiresIn: '1h' });
    res.json({ jwtToken });
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
});

app.get('/api/data', (req, res) => {
  const jwtToken = req.headers.authorization.split(' ')[1];
  jwt.verify(jwtToken, 'secretKey', (err, decoded) => {
    if (err) {
      res.status(401).json({ error: 'Unauthorized' });
    } else {
      res.json({ data: 'Data accessed with JWT' });
    }
  });
});

app.listen(3000, () => console.log('Server started'));

3:Session 鉴权

Session 鉴权是通过在服务端保存用户的会话信息来验证用户身份,它通常与 Cookie 配合使用。以下是一个简单的实现示例:

前端代码:

javascriptCopy codefetch('/api/login', {
  method: 'POST',
  body: JSON.stringify({
    username: 'user',
    password: 'password'
  }),
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => response.json())
.then(data => {
  document.cookie = `sessionId=${data.sessionId}`;
})
.catch(error => console.error(error));

后端代码:

phpCopy codeconst express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
  secret: 'secretKey',
  resave: false,
  saveUninitialized: false,
  cookie: { secure: true }
}));

app.post('/api/login', (req, res) => {
  const { username, password } = req.body;
  if (username === 'user' && password === 'password') {
    req.session.user = { username };
    res.json({ sessionId: req.session.id });
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
});

app.get('/api/data', (req, res) => {
  if (req.session.user) {
    res.json({ data: 'Data accessed with Session' });
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
});

app.listen(3000, () => console.log('Server started'));

这三种鉴权方式各有优缺点,需要根据实际情况进行选择。Token 鉴权可以在分布式环境中实现跨域身份验证,JWT 鉴权可以将用户信息加密并储存在 Token 中,Session 鉴权则需要在服务端保存用户会话信息,同时需要使用 Cookie 进行数据传输。

三种鉴权方式的特点总结如下:

1:Token 鉴权

优点:

  • 无状态,易于扩展
  • 跨域适用
  • 可以适用于多个客户端,如 Web 和移动应用

缺点:

  • Token 可能被窃取,需要采取措施保证安全性

2:JWT 鉴权

优点:

  • 可以将用户信息加密储存在 Token 中,提高安全性
  • 不需要在服务端保存会话信息,减轻服务端负担
  • 跨域适用

缺点:

  • Token 大小可能会较大
  • Token 无法在服务端主动删除,需要等待 Token 过期

3:Session 鉴权

优点:

  • 可以在服务端保存会话信息,提供更多的控制
  • 对于 Web 应用来说,可以通过 HttpOnly 属性防止 XSS 攻击

缺点:

  • 会话信息需要保存在服务端,占用内存
  • 不适用于多个客户端,如移动应用

综上所述,每种鉴权方式都有自己的优缺点,开发人员需要根据实际情况进行选择和应用。在选择鉴权方式时需要考虑安全性、可扩展性、易用性等方面的因素。

除了选择合适的鉴权方式外,还需要采取其他措施来保证接口的安全性。以下是一些保证接口安全的建议:

1:使用 HTTPS

使用 HTTPS 可以加密数据传输,防止敏感信息在传输过程中被窃取或篡改。HTTPS 也可以保证请求和响应的完整性。

2:防止 CSRF 攻击

CSRF(Cross-Site Request Forgery)攻击是一种常见的攻击方式,攻击者利用用户已经登录过的凭证来发起伪造请求,诱导用户执行某些操作。为了防止 CSRF 攻击,可以在服务器端对请求进行验证,如使用 CSRF Token。

3:防止 XSS 攻击

XSS(Cross-Site Scripting)攻击是一种常见的攻击方式,攻击者通过在页面中注入恶意代码,诱导用户执行某些操作。为了防止 XSS 攻击,可以在服务器端对输入进行过滤和验证,并在输出时进行编码。

4:对敏感数据进行加密

对于一些敏感的数据,如用户密码等,需要进行加密存储。密码应该使用密码学安全算法进行加密,如 bcrypt、PBKDF2 等。

5:控制接口访问权限

对于不同的用户,可能需要设置不同的接口访问权限。可以在服务器端对用户进行身份验证,并根据用户的身份和权限判断是否允许访问接口。

总之,保证接口的安全性需要采取多种措施,包括选择合适的鉴权方式、使用 HTTPS、防止 CSRF 攻击和 XSS 攻击、对敏感数据进行加密等。只有综合运用这些技术手段,才能保证接口的安全性。

Tags:

最近发表
标签列表