JWT 简单封装

这里就是一个JWT的简单使用
JSON Web Token 入门教程

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php

class Jwt
{
private $alg = 'sha256';

private $secret = '123456';

/**
* alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256)
* typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
* @return mixed
*/
public function getHeader()
{
$header = [
'alg' => $this->alg,
'typ' => 'JWT'
];

return $this->base64urlEncode(json_encode($header, JSON_UNESCAPED_UNICODE));
}

/**
* Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用,这里可以存放私有信息,比如uid
* @param $uid
* @return mixed
*/
public function getPayload($uid)
{
$payload = [
'iss' => 'admin', // 签发人 (issuer)
'exp' => time() + 600, // 过期时间 (expiration time)
'sub' => 'test', // 主题 (subject)
'aud' => 'every', // 受众 (audience)
'nbf' => time(), // 生效时间 (not before)
'iat' => time(), // 签发时间 (issued at)
'jti' => 10001, // 编号 (jwt id)
'uid' => $uid, // 私有信息,uid
];

return $this->base64urlEncode(json_encode($payload, JSON_UNESCAPED_UNICODE));
}

/**
* 生成token,假设现在payload里面只存一个uid
* @param $uid
* @return string
*/
public function genToken($uid)
{
$header = $this->getHeader();
$payload = $this->getPayload($uid);

$raw = $header . '.' . $payload;
$token = $raw . '.' . hash_hmac($this->alg, $raw, $this->secret);

return $token;
}

/**
* 解密校验token,成功的话返回uid
* @param $token
* @return bool
*/
public function verifyToken($token)
{
if (!$token) {
return false;
}

$tokenArr = explode('.', $token);
if (count($tokenArr) != 3) {
return false;
}

list($header, $payload, $signature) = $tokenArr;

$payloadArr = json_decode($this->base64urlDecode($payload), true);

if (!$payloadArr) {
return false;
}

// 已过期
if (isset($payloadArr['exp']) && $payloadArr['exp'] < time()) {
return false;
}

$expected = hash_hmac($this->alg, $header . '.' . $payload, $this->secret);

// 签名不对
if ($expected !== $signature) {
return false;
}

return $payloadArr['uid'];
}

/**
* 安全的base64 url编码
* @param $data
* @return string
*/
private function base64urlEncode($data)
{
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

/**
* 安全的base64 url解码
* @param $data
* @return bool|string
*/
private function base64urlDecode($data)
{
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
}

$jwt = new Jwt();

// 获取token
$token = $jwt->genToken(10000);

var_dump($token);

// 解密token
$uid = $jwt->verifyToken($token);
var_dump($uid);

结果

1
2
string(260) "eyJhbGciOiJzaGEyNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhZG1pbiIsImV4cCI6MTU1MzA2OTQ3OSwic3ViIjoidGVzdCIsImF1ZCI6ImV2ZXJ5IiwibmJmIjoxNTUzMDY4ODc5LCJpYXQiOjE1NTMwNjg4NzksImp0aSI6MTAwMDEsInVpZCI6MTAwMDB9.69b6e7d00a1c1c080b14ba1a614580fed8f1fa1b235557ed5158d7154442edb8"
int(10000)

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :