—— JSON Web Tokens 官网

JWT 是一种用于双方之间传递安全信息的简洁的、URL 安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 Json 对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名。

开源类库

文档

示例代码

基于PHP开源类库 lcobucci/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
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
<?php

use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Upfor\UpforPHP\Library\Math;

/**
 * JWT(JSON Web Tokens)
 */
class JwtHelper {

    /**
     * iss claim
     */
    const ISS = 'ISS-CLAIM-NAME';

    /**
     * exp claim
     */
    const EXP = 7200;

    /**
     * Build token
     *
     * @param  string  $secret
     * @param  string  $subject
     * @param  array   $contents
     * @param  integer $expire
     * @return \Lcobucci\JWT\Token
     */
    public static function buildToken($secret, $subject, array $contents = array(), $expire = null) {
        $builder = new Builder();

        // Configures the issuer (iss claim)
        $builder->setIssuer(self::ISS);

        // Configures the time that the token was issue (iat claim)
        $builder->setIssuedAt(time());

        // Configures the expiration time of the token (exp claim)
        if (!Math::isInt($expire) || $expire <= 0) {
            $expire = self::EXP;
        }
        $builder->setExpiration(time() + $expire);

        $builder->setSubject($subject);

        foreach ($contents as $key => $value) {
            $builder->set($key, $value);
        }

        // creates a signature using $secret as key
        $builder->sign(new Sha256(), $secret);

        return $builder->getToken();
    }

    public static function validateToken($token) {
        $data = new ValidationData();
        $data->setIssuer(self::ISS);
        $data->setCurrentTime(time());

        $token = (new Parser())->parse((string) $token);
        if (!$token->validate($data)) {
            return false;
        }

        return $token->getClaims();
    }

}