{"id":1671,"date":"2022-06-15T14:56:48","date_gmt":"2022-06-15T06:56:48","guid":{"rendered":"https:\/\/www.siediyer.cn\/?p=1671"},"modified":"2022-06-15T14:56:48","modified_gmt":"2022-06-15T06:56:48","slug":"php%e5%ae%9e%e7%8e%b0jwtjson-web-token%e9%89%b4%e6%9d%83%e5%ae%9e%e4%be%8b%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/www.siediyer.cn\/?p=1671","title":{"rendered":"php\u5b9e\u73b0JWT(json web token)\u9274\u6743\u5b9e\u4f8b\u8be6\u89e3"},"content":{"rendered":"<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Jwt\r\n{\r\n    \/\/\u4f7f\u7528HMAC\u751f\u6210\u4fe1\u606f\u6458\u8981\u65f6\u6240\u4f7f\u7528\u7684\u5bc6\u94a5(\u81ea\u5b9a\u4e49)\r\n    private static $key = 'key';\r\n    private static $instance = null;\r\n\r\n    \/\/\u5934\u90e8\r\n    private static $header = [\r\n        'alg' =&gt; 'HS256', \/\/\u751f\u6210signature\u7684\u7b97\u6cd5\r\n        'typ' =&gt; 'JWT'    \/\/\u7c7b\u578b\r\n    ];\r\n\r\n    private static $payload = [];\r\n\r\n\r\n    private function __construct()\r\n    {\r\n\r\n    }\r\n\r\n    private function __clone()\r\n    {\r\n        \/\/ TODO: Implement __clone() method.\r\n    }\r\n\r\n    public static function getInstance()\r\n    {\r\n        if(!self::$instance){\r\n            self::$instance = new self();\r\n        }\r\n        return self::$instance;\r\n    }\r\n\r\n    \/**\r\n     * @desc  \u8bbe\u7f6e$payload jwt\u8f7d\u8377\r\n     * @param array $payload jwt\u8f7d\u8377   \u683c\u5f0f\u5982\u4e0b\u975e\u5fc5\u987b\r\n     * [\r\n     *  'iss'=&gt;'jwt_admin',  \/\/\u8be5JWT\u7684\u7b7e\u53d1\u8005\r\n     *  'iat'=&gt;time(),  \/\/\u7b7e\u53d1\u65f6\u95f4\r\n     *  'exp'=&gt;time()+7200,  \/\/\u8fc7\u671f\u65f6\u95f4\r\n     *  'nbf'=&gt;time()+60,  \/\/\u8be5\u65f6\u95f4\u4e4b\u524d\u4e0d\u63a5\u6536\u5904\u7406\u8be5Token\r\n     *  'sub'=&gt;'www.admin.com',  \/\/\u9762\u5411\u7684\u7528\u6237\r\n     *  'jti'=&gt;md5(uniqid('JWT').time())  \/\/\u8be5Token\u552f\u4e00\u6807\u8bc6\r\n     * ]\r\n     * @param int $uid\r\n     *\/\r\n    public static function setPayLoad($uid = 0)\r\n    {\r\n        self::$payload = [\r\n            'uid' =&gt; $uid,         \/\/ \u7528\u6237id\r\n            'iss' =&gt; 'jwt_admin',  \/\/\u8be5JWT\u7684\u7b7e\u53d1\u8005\r\n            'iat' =&gt; time(),  \/\/\u7b7e\u53d1\u65f6\u95f4\r\n            'exp' =&gt; time() + 7200,  \/\/\u8fc7\u671f\u65f6\u95f4\r\n            'nbf' =&gt; time() + 60,  \/\/\u8be5\u65f6\u95f4\u4e4b\u524d\u4e0d\u63a5\u6536\u5904\u7406\u8be5Token\r\n            'sub' =&gt; 'www.admin.com',  \/\/\u9762\u5411\u7684\u7528\u6237\r\n            'jti' =&gt; md5(uniqid('JWT') . time())  \/\/\u8be5Token\u552f\u4e00\u6807\u8bc6\r\n        ];\r\n    }\r\n\r\n    \/**\r\n     * \u83b7\u53d6jwt token\r\n     * @return bool|string\r\n     *\/\r\n    public static function getToken()\r\n    {\r\n        $base64header = self::base64UrlEncode(json_encode(self::$header, JSON_UNESCAPED_UNICODE));\r\n        $base64payload = self::base64UrlEncode(json_encode(self::$payload, JSON_UNESCAPED_UNICODE));\r\n        return $base64header . '.' . $base64payload . '.' . self::signature($base64header . '.' . $base64payload, self::$key, self::$header['alg']);\r\n    }\r\n\r\n\r\n    \/**\r\n     * \u9a8c\u8bc1token\u662f\u5426\u6709\u6548,\u9ed8\u8ba4\u9a8c\u8bc1exp,nbf,iat\u65f6\u95f4\r\n     * @param string $Token \u9700\u8981\u9a8c\u8bc1\u7684token\r\n     * @return bool|string\r\n     *\/\r\n    public static function verifyToken($Token)\r\n    {\r\n        $tokens = explode('.', $Token);\r\n        if (count($tokens) != 3)\r\n            return false;\r\n\r\n        list($base64header, $base64payload, $sign) = $tokens;\r\n\r\n        \/\/\u83b7\u53d6jwt\u7b97\u6cd5\r\n        $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);\r\n        if (empty($base64decodeheader['alg']))\r\n            return false;\r\n\r\n        \/\/\u7b7e\u540d\u9a8c\u8bc1\r\n        if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign)\r\n            return false;\r\n\r\n        $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);\r\n\r\n        \/\/\u7b7e\u53d1\u65f6\u95f4\u5927\u4e8e\u5f53\u524d\u670d\u52a1\u5668\u65f6\u95f4\u9a8c\u8bc1\u5931\u8d25\r\n        if (isset($payload['iat']) &amp;&amp; $payload['iat'] &gt; time())\r\n            return false;\r\n\r\n        \/\/\u8fc7\u671f\u65f6\u95f4\u5c0f\u4e8e\u5f53\u524d\u670d\u52a1\u5668\u65f6\u95f4\u9a8c\u8bc1\u5931\u8d25\r\n        if (isset($payload['exp']) &amp;&amp; $payload['exp'] &lt; time())\r\n            return false;\r\n\r\n        \/\/\u8be5nbf\u65f6\u95f4\u4e4b\u524d\u4e0d\u63a5\u6536\u5904\u7406\u8be5Token\r\n        if (isset($payload['nbf']) &amp;&amp; $payload['nbf'] &gt; time())\r\n            return false;\r\n\r\n        return $payload;\r\n    }\r\n\r\n    \/**\r\n     * HMACSHA256\u7b7e\u540d   https:\/\/jwt.io\/  \u4e2dHMACSHA256\u7b7e\u540d\u5b9e\u73b0\r\n     * @param string $input \u4e3abase64UrlEncode(header).\".\".base64UrlEncode(payload)\r\n     * @param string $key\r\n     * @param string $alg \u7b97\u6cd5\u65b9\u5f0f\r\n     * @return mixed\r\n     *\/\r\n    private static function signature($input,$key,$alg = 'HS256')\r\n    {\r\n        $alg_config = [\r\n            'HS256' =&gt; 'sha256'\r\n        ];\r\n        return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key, true));\r\n    }\r\n\r\n\r\n    \/**\r\n     * Encodes to base64url\r\n     *\r\n     * @param string $data\r\n     * @return string\r\n     *\/\r\n    public static function base64UrlEncode($data)\r\n    {\r\n        return str_replace('=', '', strtr(base64_encode($data), '+\/', '-_'));\r\n    }\r\n\r\n    \/**\r\n     * Decodes from base64url\r\n     *\r\n     * @param string $data\r\n     * @return string\r\n     *\/\r\n    public static function base64UrlDecode($data)\r\n    {\r\n        if ($remainder = strlen($data) % 4) {\r\n            $data .= str_repeat('=', 4 - $remainder);\r\n        }\r\n\r\n        return base64_decode(strtr($data, '-_', '+\/'));\r\n    }\r\n}\r\n\/\/ \u7b80\u5355\u8c03\u7528\r\n\r\nclass Test2 {\r\n    \/\/  \u751f\u6210token\r\n    public function getToken()\r\n    {\r\n        $jwt = Jwt::getInstance();\r\n        $jwt-&gt;setPayLoad(1);\r\n        $jwtToken = $jwt-&gt;getToken();\r\n        var_dump($jwtToken);\r\n    }\r\n\r\n    \/\/ \u6821\u9a8ctoken\r\n    public function verifyToken(Request $request)\r\n    {\r\n        $token = $request-&gt;get('token');\r\n        $jwt = Jwt::getInstance();\r\n        $result = $jwt-&gt;verifyToken($token);\r\n        var_dump($result);\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>class Jwt { \/\/\u4f7f\u7528HMAC\u751f\u6210\u4fe1\u606f\u6458\u8981\u65f6\u6240\u4f7f\u7528\u7684\u5bc6\u94a5(\u81ea\u5b9a\u4e49) private static $ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[131,132,133],"class_list":["post-1671","post","type-post","status-publish","format-standard","hentry","category-php","tag-jwt","tag-token","tag-133"],"_links":{"self":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/1671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1671"}],"version-history":[{"count":1,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/1671\/revisions"}],"predecessor-version":[{"id":1672,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=\/wp\/v2\/posts\/1671\/revisions\/1672"}],"wp:attachment":[{"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.siediyer.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}