веб-токен json для практики Egg.js

задняя часть алгоритм JSON Egg.js

Распознать веб-токен json

Согласно определению Википедии,JSON WEB Token(JWT, произносится [/dʒɒt/]), представляет собой токен на основе JSON, используемый для подтверждения претензии в Интернете. JWT обычно состоит из трех частей: информации заголовка (header), тела сообщения (payload) и подписи (signature).

Информация заголовка указывает алгоритм подписи, используемый этим JWT:

header = '{"alg":"HS256","typ":"JWT"}'

Тело сообщения содержит намерение JWT:

payload = '{"loggedInAs":"admin","iat":1422779638}'

Подпись рассчитывается из закрытого ключа:

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

Наконец, подпись в кодировке base64url (также разделенная знаком «.») вставляется в конец неподписанного токена, который является JWT:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature) 

JWT практика Egg.js

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

// {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.Метод входа

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. Пользовательский метод

 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:7001/login принимает имя параметра

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

Затем добавьте токен в заголовок и получите доступ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}}