基于JWT实现接口的授权访问详解攻略如下。
JWT简介
JWT (JSON Web Token) 是一种用于进行身份认证的开放标准(RFC 7519)。JWT由三部分组成:Header、Payload 和 Signature。其中,Payload 用于存储要传递的信息,可以包括用户 ID、角色等信息。Header 使用 Base64 编码存储,表示使用的算法、类型等信息。Signature 用于验证用户的授权信息。
使用 JWT 进行身份认证时,服务端在用户登录时签发一个 JWT,用户将该JWT在之后的 API 调用中附加到请求的头部 Authorization 中,服务端在接收到请求后会验证 JWT 的有效性,从而实现对用户身份的验证。
接下来我们将详细说明如何实现基于JWT的接口授权访问。
生成 JWT
服务端在用户登录时,需要生成一个包含用户信息的JWT,以做为后续接口请求的凭证。具体代码可以参考以下示例。
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
// 用户登录成功后生成JWT
function generateToken(user) {
const payload = {
userId: user.id,
username: user.username,
role: user.role,
};
return jwt.sign(payload, SECRET_KEY, {
expiresIn: '1h', // 有效期为1小时
});
}
在上述代码中,我们使用jsonwebtoken的sign()函数生成JWT。其中,payload 参数包含要存储的信息,SECRET_KEY 用于生成 Signature,expiresIn 表示 JWT 有效期为1小时。
解析 JWT
在服务端收到API请求时,需要对请求头部中携带的 JWT 进行解析和验证。具体代码可以参考以下示例。
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
// 解析JWT
function verifyToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ message: 'Missing Authorization Header' });
}
const token = authHeader.split(' ')[1];
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (err) {
return res.status(401).json({ message: 'Invalid Token' });
}
}
在上述代码中,我们从请求头部中获取 JWT(header.Authorization),然后使用jsonwebtoken的verify()函数进行解析验证。如果验证通过,则将解析后的信息存储到req.user中,并调用next()继续处理请求;如果验证不通过,则返回401。
示例一:Express实现JWT授权访问
接下来,我们使用Express框架实现JWT授权访问。
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const SECRET_KEY = 'your_secret_key';
function generateToken(user) {
const payload = {
userId: user.id,
username: user.username,
role: user.role,
};
return jwt.sign(payload, SECRET_KEY, {
expiresIn: '1h',
});
}
function verifyToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ message: 'Missing Authorization Header' });
}
const token = authHeader.split(' ')[1];
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (err) {
return res.status(401).json({ message: 'Invalid Token' });
}
}
// 用户登录接口
app.post('/login', (req, res) => {
// 根据用户名和密码进行身份验证,省略验证代码
const user = {
id: 1,
username: 'admin',
role: 'admin',
};
const token = generateToken(user);
res.json({ token });
});
// 获取用户信息接口
app.get('/user', verifyToken, (req, res) => {
res.json({ user: req.user });
});
app.listen(3000, () => console.log('Server is running'));
在上述代码中,我们定义了两个接口:/login 用来生成JWT,/user 用来获取当前登录用户的信息。
用户登录时,服务端生成 JWT 并返回给用户,用户在调用 /user 接口时将携带该JWT,服务端会在 verifyToken() 中对JWT进行验证,如果验证通过,则在 req.user 中存放解析后的用户信息,然后将用户信息返回给用户。
示例二:Koa实现JWT授权访问
接下来,我们使用Koa框架实现JWT授权访问。
const Koa = require('koa');
const Router = require('@koa/router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router();
const SECRET_KEY = 'your_secret_key';
function generateToken(user) {
const payload = {
userId: user.id,
username: user.username,
role: user.role,
};
return jwt.sign(payload, SECRET_KEY, {
expiresIn: '1h',
});
}
function verifyToken(ctx, next) {
const authHeader = ctx.headers.authorization;
if (!authHeader) {
ctx.throw(401, 'Missing Authorization Header');
}
const token = authHeader.split(' ')[1];
try {
const decoded = jwt.verify(token, SECRET_KEY);
ctx.user = decoded;
return next();
} catch (err) {
ctx.throw(401, 'Invalid Token');
}
}
// 用户登录接口
router.post('/login', (ctx) => {
// 根据用户名和密码进行身份验证,省略验证代码
const user = {
id: 1,
username: 'admin',
role: 'admin',
};
const token = generateToken(user);
ctx.body = { token };
});
// 获取用户信息接口
router.get('/user', verifyToken, (ctx) => {
ctx.body = { user: ctx.user };
});
app.use(router.routes());
app.listen(3000, () => console.log('Server is running'));
在上述代码中,我们定义了两个接口:/login 用来生成JWT,/user 用来获取当前登录用户的信息。
用户登录时,服务端生成 JWT 并返回给用户,用户在调用 /user 接口时将携带该JWT,服务端会在 verifyToken() 中对JWT进行验证,如果验证通过,则在 ctx.user 中存放解析后的用户信息,然后将用户信息返回给用户。
以上是关于“如何基于JWT实现接口的授权访问详解”的完整攻略,希望可以帮助你了解JWT身份验证的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何基于JWT实现接口的授权访问详解 - Python技术站