koa jwt鉴权

<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">
    </script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <input v-model="username" />
        <input v-model="password" />
      </div>
      <div>
        <button v-on:click="login">Login</button>
      <button v-on:click="logout">Logout</button>
    <button v-on:click="getUser">GetUser</button>
 </div>
  <div>
    <button @click="logs=[]">Clear Log</button>
 </div >
 < !-- ⽇志-- >
  <ul>
    <li v-for="(log,idx) in logs" :key="idx">
 {{ log }}
 </li>
 </ul >
 </div >
  <script>
    axios.interceptors.request.use(
 config => {
 const token = window.localStorage.getItem("token");
 if (token) {
      // 判断是否存在token,如果存在的话,则每个http header都加上token
      // Bearer是JWT的认证头部信息
      
 config.headers.common["Authorization"] = "Bearer " +
token;
 }
 return config;
 },
 err => {
 return Promise.reject(err);
 }
 );
 axios.interceptors.response.use(
 response => {
      app.logs.push(JSON.stringify(response.data));
 return response;
 },
 err => {
      app.logs.push(JSON.stringify(response.data));
 return Promise.reject(err);
 }
 );
 var app = new Vue({
      el: "#app",
 data: {
      username: "test",
 password: "test",
 logs: []
 },
 methods: {
      login: async function() {
 const res = await axios.post("/users/login-token", {
      username: this.username,
 password: this.password
 });
 localStorage.setItem("token", res.data.token);
 },
 logout: async function() {
      localStorage.removeItem("token");
 },
 getUser: async function() {
      await axios.get("/users/getUser-token");
 }
 }
 });
 </script>
 </body >
</html >
const Koa = require('koa')
const router = require('koa-router')()
const jwt = require("jsonwebtoken")
const jwtAuth = require("koa-jwt")
const secret = "it's a secret"
const cors = require('koa2-cors')
const bodyParser = require('koa-bodyparser')
const static = require('koa-static')
const app = new Koa();
app.keys = ['some secret'];
app.use(static(__dirname + '/'));
app.use(bodyParser())
router.post("/users/login-token", async ctx => {
  const { body } = ctx.request;
  //登录逻辑,略
  //设置session
  const userinfo = body.username;
  ctx.body = {
    message: "登录成功",
    user: userinfo,
    // ⽣成 token 返回给客户端
    token: jwt.sign(
      {
        data: userinfo,
        // 设置 token 过期时间,⼀⼩时后,秒为单位
        exp: Math.floor(Date.now() / 1000) + 60 * 60
      },
      secret
    )
  };
});
router.get(
  "/users/getUser-token",
  jwtAuth({
    secret
  }),
  async ctx => {
    // 验证通过,state.user
    console.log(ctx.state.user);

    //获取session
    ctx.body = {
      message: "获取数据成功",
      userinfo: ctx.state.user.data
    };
  }
);
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值