1、获取服务器返回的token
2、将token缓存在本地
wx.setStorageSync('token',token);
3、发送请求时携带token
通过本地缓存获取token
携带token方式
(1)cookie(不推荐)
(2)作为参数在url中
(3)发送网络请求时放在请求头
header:{
authorization:token
}
4、服务器从本地获取token并验证token身份
let token=ctx.request.header.authorization;
try{
let res=jwt.verify(token,'加密信息时的信息'); 解密不成功将会报错
ctx.body="验证成功";
}catch(e){
ctx.body='验证失败';
}
token认证流程
token 的认证流程与cookie很相似
用户登录,成功后服务器返回Token给客户端。
客户端收到数据后保存在客户端
客户端再次访问服务器,将token放入headers中
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
代码示例:
koa后台生成验证:
let koa =require('koa');
let koaRouter=require('koa-router');
let Fly=require("flyio/src/node")
let fly=new Fly;
let jwt = require('jsonwebtoken');
//生成应用以及路由器实例
const app=new koa();
const router=new koaRouter();
//使用路由及路由器
app.use(router.routes()) //声明使用路由
.use(router.allowedMethods()); //允许使用路由的方法
//监听端口
app.listen(3000,()=>{
console.log('this koa server is running at http://127.0.0.1:3000');
})
//创建路由
//ctx上下文取代req,res
router.get('/',(ctx,next)=>{
//获取请求参数
//响应数据
ctx.body="服务器返回";
})
router.get('/search',(ctx,next)=>{
let req=ctx.query.id;
let arr=[];
for(let i=0;i<req*5;i++)
{
arr.push(i);
}
ctx.body=arr;
})
//生成token并返回
router.get('/getOpenId',async (ctx,next)=>{
let code=ctx.query.code;
let appid='xx';
let appSecret='xx';
let url=`https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;
//发送请求给微信接口,获取openId
let res= await fly.get(url)
//将openidh阿sessionKey进行加密;
let token=jwt.sign(JSON.parse(res.data),'awdawadca');
ctx.body=token;
})
//验证
router.get('/test',(ctx,next)=>{
//获取请求头的token
let token=ctx.request.header.authorization;
//如果解密不对,将会报错,使用try-catch不阻断程序
try{
let res=jwt.verify(token,'awdawadca');
ctx.body="验证成功";
}catch(e){
ctx.body='验证失败';
}
})
前端请求获取token,存进本地缓存并验证:
App.vue:
async mounted()
{
wx.login({
success:async (res)=>{
//每次获取都不一样,和用户是否授权登录无关
let code=res.code;
//发送临时凭证code给服务器端,返回加密token
let token=await request("http://127.0.0.1:3000/getOpenId",{code:code});
//将自定义登录状态缓存到storage中
wx.setStorageSync('token',token);
}
})
//测试token
let auth=await request("http://127.0.0.1:3000/test")
console.log(auth);
}
封装的网络请求中将token添加进请求头:
//携带token方式 1、cookie(不推荐)2、作为参数在url中 3、放在请求头
let token=wx.getStorageSync('token');
export default function(url,data={},method='GET')
{
return new Promise((resolve,reject)=>{
wx.request({
url,
method,
data,
header:{
authorization:token
},
success:(res)=>{
resolve(res.data);
},
fail:(err)=>{
reject(err);
}
})
})
}
版权声明:本文为weixin_43294560原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。