发布于 

token的使用

tp6实现JWT

composer安装JWT

1
composer require firebase/php-jwt

引入并使用

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
//引入token工具
use Firebase\JWT\JWT;
use Firebase\JWT\Key;


class Test {
private $key = 'example_key'; //这里填写你自己设置的密钥

//加密并返回token
public function generate($userId){
$payload = [
'iss' => 'http://example.org', //jwt签发方,这个地方可以自定义
'aud' => 'http://example.com', //jwt接收方,这个地方可以自定义
'exp' => time()+3600*2, //jwt的过期时间,过期时间必须大于签发时间
'iat' => time(), //jwt的签发时间
'nbf' => time(), //定义在什么时间之前,某个时间点后才能访问
'data' => [
'userId' => $userId
]
];

$token = JWT::encode($payload, $this->key, 'HS256'); //encode加密
return $token;
}

//解密
public function parse($token){
$decoded = JWT::decode($token, new Key($this->key, 'HS256')); //decode解密

// 如果用户的token解密后的一些数据(比如账号id)和前端登录保存在cookie里的账户id是吻合的,那么就说明是本人
return $decoded->data->userId;
}

public function authToken(){
$createToken = $this->generate('zhangs');
echo $createToken;
echo '<br>';
$token = Request::get('token');

echo $this->parse($token);
}
}

解决跨域

tp6解决跨域,在middleware.php中配置

1
2
//跨域请求支持
\think\middleware\AllowCrossDomain::class,

首次请求生成token和设置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
const data = JSON.stringify({
userAccount: 91222,
password: 'swp'
});

//这里需要判断token是否存在,存在就从存储中获取token
let token = localStorage.getItem('token')

fetch('http://www.sunwp.com/sunwp_forum/test/test',{
method:"POST",
body:data,
headers:{
'Content-Type': 'application/json',
//设置请求头
'Authorization': `${token}`, //在ts中直接赋值会报错,使用模板字符串

}

}).then(response => response.json())
.then(data => {
console.log('获取的数据',data)
return data
})
.then(res=>{
//处理从服务器返回的数据,设置token
let token = res.token
localStorage.setItem('token',token)
console.log('已将token存放到local storage中')

})
.catch((error)=>{
console.log('Error',error)
})

后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public function test(){
//获取前端发过来的数据
$userAccount = Request::param('userAccount');
$password = Request::param('password');
//初始化token
$token = null;
//验证账号和密码是否正确
if($userAccount == '91222'){
$status = 0;
if($password == 'swp'){
$status = 1;
//成功后进行生成token
$token = $this->generate($userAccount);
}

}else{
$status = 0;
}

$data = ['msg'=>'返回的信息','status'=>$status,'token'=>$token];
return json($data);
}

非首次请求设置请求头和获取请求头

前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let token = localStorage.getItem('token')

fetch('http://www.sunwp.com/sunwp_forum/test/test2',{
method:"GET",
headers:{
'Content-Type': 'application/json',
'Authorization': `${token}`, //在ts中直接赋值会报错,使用模板字符串

}

}).then(response => response.json())
.then(res=>{
console.log(res)
})

tp6

1
2
3
4
5
6
7
8
public function test2(){
$header = Request::header('Authorization');
//将token解码,得到用户信息
$param = $this->parse($header);

$data = ['msg'=>'用户信息','data'=>$param];
return json($data);
}