验证token

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);
      }
    })
  })
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值