json web token for Egg.js 实践

栏目: 后端 · 前端 · 发布时间: 7年前

内容简介:根据维基百科的定义,头信息指定了该JWT使用的签名算法:消息体包含了JWT的意图:

根据维基百科的定义, JSON WEB TokenJWT ,读作 [/dʒɒt/]),是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。

头信息指定了该JWT使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'
复制代码

消息体包含了JWT的意图:

payload = '{"loggedInAs":"admin","iat":1422779638}'
复制代码

签名则通过私有的key计算而成:

key = 'secretkey'  
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)  
signature = HMAC-SHA256(key, unsignedToken) 
复制代码

最后在未签名的令牌尾部拼接上base64url编码的签名(同样使用"."分隔)就是JWT了:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) 
复制代码

Egg.js jwt实践

1.安装egg-jwt插件

npm install egg-jwt --save
复制代码

2.启用egg-jwt插件

// {app_root}/config/plugin.js
exports.jwt = {
  enable: true,
  package: "egg-jwt"
};
复制代码

3.配置jwt 私有key

// {app_root}/config/config.default.js
exports.jwt = {
  secret: "123456" //自己设置的值
};
复制代码

4.设置路由

// {app_root}/app/router.js      
  router.get('/', controller.home.index);
  router.post('/user',app.jwt,controller.home.user);
  router.get('/login',controller.home.login);
复制代码

5.Login方法

onst user = ctx.request.body
    if(user && user.name) {
        let userToken = {
            name: user.name
        }
        const token = app.jwt.sign(userToken, secret, {expiresIn: '1h'})  //token签名 有效期为1小时
        ctx.body = {
            message: '获取token成功',
            code: 1,
            token
        }
    } else {
        ctx.body = {
            message: '参数错误',
            code: -1
        }
    }
	  }
复制代码

6.User方法

const token = ctx.header.authorization  // 获取jwt
    let payload
    if (token) {
        payload = await app.jwt.verify(token.split(' ')[1], secret)  // // 解密,获取payload
        ctx.body = {
            payload
        }
    } else {
        ctx.body = {
            message: 'token 错误',
            code: -1
        }
    }
复制代码

7.通过curl模拟请求

curl http://127.0.0.1:7001/user
//返回Authentication Erro  //验证错误,说明我们的jwt已经生效
复制代码

访问 http://127.0.0.1:7 001/login 带上参数name

curl -d "name=tiptoe" http://127.0.0.1:7001/api/login
//返回结果{"message":"获取token成功","code":1,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoidGlwdG9lIiwiaWF0IjoxNDk2Mzg4NzgwLCJleHAiOjE0OTYzOTIzODB9.N2e-84Pmf466DQJ2x3ldd1AWC1IL97ZRWwiDR-Oebhs"}
复制代码

然后在header中加入token,在访问http://127.0.0.1:7001/user

// Authorization: Bearer 授权:令牌类型为Bearer curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoidGlwdG9lIiwiaWF0IjoxNDk2Mzg4NzgwLCJleHAiOjE0OTYzOTIzODB9.N2e-84Pmf466DQJ2x3ldd1AWC1IL97ZRWwiDR-Oebhs" http://127.0.0.1:7001/user
复制代码

返回如下内容,说明认证已经通过

{"payload":{"name":"tiptoe","iat":1496398614,"exp":1496402214}}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Caching

Web Caching

Duane Wessels / O'Reilly Media, Inc. / 2001-6 / 39.95美元

On the World Wide Web, speed and efficiency are vital. Users have little patience for slow web pages, while network administrators want to make the most of their available bandwidth. A properly design......一起来看看 《Web Caching》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具