美文网首页
Token的使用

Token的使用

作者: 波仔_4867 | 来源:发表于2021-03-24 16:07 被阅读0次

网址:https://www.jianshu.com/p/58abb716b5dc/

具体概念参考上面链接

Token验证的基本流程

1.服务端收到请求,去验证用户名与密码
2.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
3.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
4.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
5.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

JWT标准的Token有如下三个部分

header (头部)
payload (数据)
signature (签名)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc

安装

//生成token与验证
 1.jsonwebtoken
 npm install jsonwebtoken --save
 * 生成token的方法 sign
 * 验证token的方法 verify

2.express-jwt
 npm install express-jwt --save
* 验证token是否过期并规定那些路由不需要验证 express-jwt({})

token Express后端相关代码

定义生成token和获取token的函数

/token/token.js

const jwt = require('jsonwebtoken');

// 密钥
const jwtSecret = 'dkfjdjfkdfdfd';  //签名

//登录接口 生成token的方法
// setToken携带的参数及参数的数量自定义
const setToken = function (user_name) {
    return new Promise((resolve, reject) => {
        //expiresln 设置token过期的时间
        //{ user_name: user_name, user_id: user_id } 传入需要解析的值( 一般为用户名,用户id 等)
        // const token = jwt.sign({ user_name: user_name }, jwtSecret, { expiresIn: '24h' });
        const token = jwt.sign({ user_name: user_name }, jwtSecret, { expiresIn: '10s' });
        resolve(token)
    })
}
//各个接口需要验证token的方法
const getToken = function (token) {
    return new Promise((resolve, reject) => {
        if (!token) {
            console.log('token是空的')
            reject({
                error: 'token 是空的'
            })
        }
        else {
            // 验证token
            var info = jwt.verify(token.split(' ')[1], jwtSecret);
            resolve(info);  //解析返回的值(sign 传入的值)
        }
    })
}

module.exports = {
    setToken,
    getToken
}

解析token,验证token

app.js


const express = require("express")
const app = express()
//express跨域
const cors = require("cors")
// 生成token和验证token是否正确的函数
const vertoken=require('./token/token')

//验证token是否过期,并规定哪些路由不用验证token
const expressJwt=require('express-jwt')

const bookRouter = require("./router/bookRouter")
const userRouter = require("./router/userRouter")
app.use(cors())

//允许访问upload下的静态资源
app.use(express.static("upload"))
// 解析post请求的参数
app.use(express.json())

//=============================================验证token

//解析token获取用户信息
app.use(function(req, res, next) {
    let token = req.headers['authorization'];
    if(token == undefined){
        next();
    }else{
        vertoken.getToken(token).then((data)=> {
            console.log('解析后的token',data);
            req.data = data;
            next();
        }).catch((error)=>{
            next();
        })
    }
});

//验证token是否过期并规定那些路由不需要验证
app.use(expressJwt({
    secret:'dkfjdjfkdfdfd',
    // 加密算法
    algorithms:['HS256']
}).unless({
    path:['/login']  //不需要验证的接口名称
}))

//设置托管静态目录; 项目根目录+ public.可直接访问public文件下的文件eg:http://localhost:3000/images/url.jpg

//token失效返回信息
app.use(function(err,req,res,next){
    if(err.status==401){
        res.status(401).send('token失效11111111')
    }
})

app.use(bookRouter)
app.use(userRouter)

app.listen(3000, () => {
    console.log("服务器已开启在3000端口");
})


登录接口

/router/usersRouter.js

const express = require("express")
const router = express.Router()
const conn = require("../db/db")
const vertoken = require("../token/token")

// 查询商品
router.post("/login", (req, res) => {
    let { user_name, pw } = req.body;
    let sql = "select * from admin where user_name = ? and pw = ?"
    conn.query(sql, [user_name, pw], function (err, result) {
        if (err) {
            console.log('查询数据库失败');
        } else {
            let data;
            if (result.length) {
                //==============================================调用生成token的方法
                vertoken.setToken(user_name).then(token => {
                    data = {
                        code: 0,
                        message: '登录成功',
                        token: token
                        //前端获取token后存储在localStroage中,
                        //**调用接口时 设置axios(ajax)请求头Authorization的格式为`Bearer ` +token
                    }
                    res.send(data)
                })
            } else {
                data = {
                    code: 1,
                    msg: '登录失败 '
                }
                res.send(data)
            }
            
        }
    })
})


module.exports = router

token Vue前端相关代码

登录后获取token

login(this.ruleForm)
    .then((res) => {
        console.log('login返回的数据');
        if (res.data.code == 0) {
        this.$message({
            message: "登录成功",
            center: true,
        });

        //存储token
        localStorage.setItem("token",res.data.token)
        this.$router.push("/Layout")
        }
    });

前端请求携带token

api/config.js

import axios from 'axios'

// 给所有axios请求设置基础的域名
// axios.defaults.baseURL = 'http://localhost:3000'


//用axios.create可以创建axios的实例,允许不同实例有不同配置
const axios1 = axios.create({
    baseURL: 'http://localhost:3000',
    // 请求超时的时间
    timeout: 5000
}); 
// const axios2 = axios.create({
//     baseURL: 'http://www.test.com',
//     timeout: 5000
// });


//添加请求拦截器,会在发起请求之前执行相应的需求
axios1.interceptors.request.use(function (config) {
    // console.log('我是请求拦截器');
    config.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem("token");
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// //添加响应拦截器,会在返回数据后先执行相应的需求
axios1.interceptors.response.use(function (response) {
    console.log('我是响应拦截器');
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    console.log('error',error.status);

    return Promise.reject(error);
  });
export default axios1

相关文章

  • Android中 token 的使用

    什么是 token; 为什么要使用 token; 在 Android 中应该如何使用 token;ok,今天的学习...

  • jwt-simple 包使用详解

    一、简介 JWT(JSON Web Token) 编码解码模块 二、使用 安装 生成token & 解析token...

  • Token原则

    Token使用原则:

  • jsonwebtoken生成与解析token

    之前写了一篇介绍token的文章:简单理解Token机制,token算法自己设计的,使用了随机算法,导致token...

  • Token的使用

    网址:https://www.jianshu.com/p/58abb716b5dc/[https://www.ji...

  • Vue -- token/refresh_token 使用机制

    通过文章加深对token、refresh_token的理解,以及怎么使用 后端 1.登录获取token,如果已经登...

  • token

    1、拿到token第一步当然是登录接口ok,可以返回token 返回的token使用jsonpathtester ...

  • iOS AppToken 的使用

    1.Token 是什么 Token主要是服务器如何判断当前用户是否登录所使用的标示。在短链接中一般是使用Token...

  • 微信小程序

    登录 后台判断是否已注册,如果已注册会返回access_token 使用token 将返回的token存在缓存中,...

  • SpringCloud系列之网关gateway-12.实现JWT

    1.使用JWT实现获取token和校验token 首先引入依赖 使用JWT加解密逻辑 controller层 ga...

网友评论

      本文标题:Token的使用

      本文链接:https://www.haomeiwen.com/subject/gojhhltx.html