亲爱的小伙伴你好,你是否还在苦恼如何在自己使用Nodejs写的接口中生成token字符串,以及解析从客户端发送过来的token字符串呢?别担心,下边我将通过详细的步骤以及一个小案例来教会你如何进行相关操作。
1.安装express
npm install express cors --save
2.安装jsonwebtoken和express-jwt第三方包
npm i jsonwebtoken express-jwt --save
3.在你的项目文件夹重创建一个app.js文件
4.在app.js文件中进行接口代码编写
下边的代码我是一步步循序渐进编写的,每一步都有上一步的代码,如果想要最终代码,直接到最后一步即可。
4.1先使用express创建一个基本的服务器
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.2 导入 jsonwebtoken 和 express-jwt 第三方包
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.3 创建一个密钥
密钥里边的字符串可以自定义
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//4.3步骤
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.4注册将客户端发送过来的 jwt 字符串,解析还原成 JSON 对象的中间件 express-jwt
注意:
1.这边将jwt字符串解析出来的信息会被挂载到req.user属性上,可以通过req.user属性获取到信息。
2.下边的unless({path[]})中是不需要 token访问权限的路径。
3. 这边注意一下,你的登录请求路径,放一定在unless({path[]})中,让它无需token权限,否则你会一直请求失败(这个坑我踩过)如下边代码所示:
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//4.3步骤
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
//4.4步骤
app.use(expressJWT({ secret: secretKey }).unless({ path: ['/login'] }))
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.5 编写登录接口,生成 jwt 字符串
1.先判断是否登录成功,在登录成功后,就开始使用 jsonwebtoken 生成 jwt 字符串
2.注意:千万不要将密码添加到token字符串中,否则可能会造成密码泄露
3.格式:jwt.sign({用户信息},密钥,token有效时长)
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//4.3步骤
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
//4.4步骤
app.use(expressJWT({ secret: secretKey }).unless({ path: ['/login'] }))
//4.5步骤
app.post('/login', (req, res) => {
// 登录失败
if (req.body.username !== 'admin' && req.body.password !== '123321') {
return res.send({
status: '400',
message: '登录失败'
})
}
// 登录成功
// 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
// 格式:jwt.sign({用户信息},密钥,token有效时长)
var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
res.send({
status: 200,
message: '登录成功',
token: tokenStr
})
})
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.6 编写获取用户信息接口
注意:里边的username属性值,就来自于jwt字符串的解析,如果客户端在请求头中携带的 token 有问题,那么将会解析失败,那么这个请求也会失败。
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//4.3步骤
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
//4.4步骤
app.use(expressJWT({ secret: secretKey }).unless({ path: ['/login'] }))
//4.5步骤
app.post('/login', (req, res) => {
// 登录失败
if (req.body.username !== 'admin' && req.body.password !== '123321') {
return res.send({
status: '400',
message: '登录失败'
})
}
// 登录成功
// 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
// 格式:jwt.sign({用户信息},密钥,token有效时长)
var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
res.send({
status: 200,
message: '登录成功',
token: tokenStr
})
})
//4.6步骤
app.get('/user/info', (req, res) => {
return res.send({
status: 200,
message: '请求成功!',
data: {
age: 18,
gender: '男',
username: req.user.username //这里的username就来自于jwt字符串的解析
}
})
})
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
4.7 编写一个错误中间件
这边我们需要编写一个错误中间件,用来抛出错误,防止因为错误而造成接口崩溃
注意:错误中间件一定要放在所有路由之后
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//4.2步骤
// 1.导入jsonwebtoken生成 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt')
//4.3步骤
const secretKey = 'aflowerdemon is No1 ^_^' //密钥里边的字符可以自定义
//4.4步骤
app.use(expressJWT({ secret: secretKey }).unless({ path: ['/login'] }))
//4.5步骤
app.post('/login', (req, res) => {
// 登录失败
if (req.body.username !== 'admin' && req.body.password !== '123321') {
return res.send({
status: '400',
message: '登录失败'
})
}
// 登录成功
// 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
// 格式:jwt.sign({用户信息},密钥,token有效时长)
var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
res.send({
status: 200,
message: '登录成功',
token: tokenStr
})
})
//4.6步骤
app.get('/user/info', (req, res) => {
return res.send({
status: 200,
message: '请求成功!',
data: {
age: 18,
gender: '男',
username: req.user.username //这里的username就来自于jwt字符串的解析
}
})
})
//4.7步骤
app.use((err, req, res, next) => {
// 如果错误是由token解析失败导致的
if (err.name === 'UnauthorizedError') {
return res.send({
status: 401,
message: '无效的token'
})
}
// 如果是其他位置原因导致的错误
res.send({
status: 500,
message: '未知的错误'
})
next()
})
//启动服务器
app.listen(5000,function(){
console.log('express server running at http://127.0.0.1:5000')
})
5.接口测试
5.1在终端中运行app.js文件
5.2在postman中建立一个选项卡,进行登录测试
1.选择post方式 2.将请求地址粘贴到地址栏3.点击body,选择x-www-form-urlencoded 4.在表单数据中添加 username(admin) 和 password(123321)5.点击send按钮发送登录请求6.拿到token值
5.3在postman中建立一个选项卡,进行用户数据获取
1.选择GET请求方式 2.将请求地址粘贴到地址栏 3.点击Headers添加一个名为“Authorization”的属性。4.属性值为Bearer+空格+登录请求返回的token字符串 5.点击Send按钮发送请求 6.获取到请求的数据
如果在通过 user/info 路径请求用户信息时不在请求头中携带token,那么将会请求失败