PHP JWT token实现

原文链接:https://www.jb51.net/article/146790.htm

机制:

代码如下:

<?php

/**

 * PHP实现jwt

 */

class Jwt {

  //头部

  private static $header=array(

    ‘alg‘=>‘HS256‘, //生成signature的算法

    ‘typ‘=>‘JWT‘  //类型

  );

  //使用HMAC生成信息摘要时所使用的密钥

  private static $key=‘123456‘;

  /**

   * 获取jwt token

   * @param array $payload jwt载荷  格式如下非必须

   * [

   * ‘iss‘=>‘jwt_admin‘, //该JWT的签发者

   * ‘iat‘=>time(), //签发时间

   * ‘exp‘=>time()+7200, //过期时间

   * ‘nbf‘=>time()+60, //该时间之前不接收处理该Token

   * ‘sub‘=>‘www.admin.com‘, //面向的用户

   * ‘jti‘=>md5(uniqid(‘JWT‘).time()) //该Token唯一标识

   * ]

   * @return bool|string

   */

  public static function getToken(array $payload)

  {

    if(is_array($payload))

    {

      $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));

      $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));

      $token=$base64header.‘.‘.$base64payload.‘.‘.self::signature($base64header.‘.‘.$base64payload,self::$key,self::$header[‘alg‘]);

      return $token;

    }else{

      return false;

    }

  }

  /**

   * 验证token是否有效,默认验证exp,nbf,iat时间

   * @param string $Token 需要验证的token

   * @return bool|string

   */

  public static function verifyToken(string $Token)

  {

    $tokens = explode(‘.‘, $Token);

    if (count($tokens) != 3)

      return false;

    list($base64header, $base64payload, $sign) = $tokens;

    //获取jwt算法

    $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);

    if (empty($base64decodeheader[‘alg‘]))

      return false;

    //签名验证

    if (self::signature($base64header . ‘.‘ . $base64payload, self::$key, $base64decodeheader[‘alg‘]) !== $sign)

      return false;

    $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);

    //签发时间大于当前服务器时间验证失败

    if (isset($payload[‘iat‘]) && $payload[‘iat‘] > time())

      return false;

    //过期时间小宇当前服务器时间验证失败

    if (isset($payload[‘exp‘]) && $payload[‘exp‘] < time())

      return false;

    //该nbf时间之前不接收处理该Token

    if (isset($payload[‘nbf‘]) && $payload[‘nbf‘] > time())

      return false;

    return $payload;

  }

  /**

   * base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现

   * @param string $input 需要编码的字符串

   * @return string

   */

  private static function base64UrlEncode(string $input)

  {

    return str_replace(‘=‘, ‘‘, strtr(base64_encode($input), ‘+/‘, ‘-_‘));

  }

  /**

   * base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现

   * @param string $input 需要解码的字符串

   * @return bool|string

   */

  private static function base64UrlDecode(string $input)

  {

    $remainder = strlen($input) % 4;

    if ($remainder) {

      $addlen = 4 - $remainder;

      $input .= str_repeat(‘=‘, $addlen);

    }

    return base64_decode(strtr($input, ‘-_‘, ‘+/‘));

  }

  /**

   * HMACSHA256签名  https://jwt.io/ 中HMACSHA256签名实现

   * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload)

   * @param string $key

   * @param string $alg  算法方式

   * @return mixed

   */

  private static function signature(string $input, string $key, string $alg = ‘HS256‘)

  {

    $alg_config=array(

      ‘HS256‘=>‘sha256‘

    );

    return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));

  }

}

  //测试和官网是否匹配begin

  $payload=array(‘sub‘=>‘1234567890‘,‘name‘=>‘John Doe‘,‘iat‘=>1516239022);

  $jwt=new Jwt;

  $token=$jwt->getToken($payload);

  echo "<pre>";

  echo $token;

  

  //对token进行验证签名

  $getPayload=$jwt->verifyToken($token);

  echo "<br><br>";

  var_dump($getPayload);

  echo "<br><br>";

  //测试和官网是否匹配end

  

  

  //自己使用测试begin

  $payload_test=array(‘iss‘=>‘admin‘,‘iat‘=>time(),‘exp‘=>time()+7200,‘nbf‘=>time(),‘sub‘=>‘www.admin.com‘,‘jti‘=>md5(uniqid(‘JWT‘).time()));;

  $token_test=Jwt::getToken($payload_test);

  echo "<pre>";

  echo $token_test;

  

  //对token进行验证签名

  $getPayload_test=Jwt::verifyToken($token_test);

  echo "<br><br>";

  var_dump($getPayload_test);

  echo "<br><br>";

  //自己使用时候end

原文地址:https://www.cnblogs.com/youantianqin/p/11798402.html

时间: 2024-08-30 08:29:02

PHP JWT token实现的相关文章

IdentityServer4实战 - 谈谈 JWT Token 的安全策略

一.前言 众所周知,IdentityServer4 默认支持两种类型的 Token,一种是 Reference Token,一种是 JWT Token .前者的特点是 Token 的有效与否是由 Token 颁发服务集中化控制的,颁发的时候会持久化 Token,然后每次验证都需要将 Token 传递到颁发服务进行验证,是一种中心化的比较传统的验证方式.JWT Token 的特点与前者相反,每个资源服务不需要每次都要都去颁发服务进行验证 Token 的有效性验证,该 Token 由三部分组成,其中

如何在启用JWT Token授权的.NET Core WebApi项目中下载文件

背景 前几天,做项目的时候遇到一个文件下载的问题.当前系统是一个前后端分离的项目,前端是一个AngularJs项目, 后端是一个.NET Core WebApi项目.后端的Api项目使用了Jwt Token授权,所以每个Api请求都需要传递一个Bearer Token. 这一切都看起来理所当然,但是当需要从WebApi下载文件的时候,出现了问题.以前下载文件的时候,我们可以在Javascript中使用window.open('[文件下载Api]')的方式下载文件,但是这个方法不能接收Bearer

android 中使用jwt token(json web token)--java

http://blog.csdn.net/mingzhnglei/article/details/51119836 下面贴上自己项目中的一个小小的example import com.nimbusds.jose.JOSEException; import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.JWSHeader; import com.nimbusds.jose.JWSObject; import com.nimbusd

koa2+redis+jwt token验证,简单注册登录

首先新建文件夹命名koa-server,npm init,相关包的安装就不说了,这是我的package.json 新建index.js文件,编码如下,config全局配置不用管,redis是一个简单的get和set操作的封装,也不用管 const bodyParser = require("koa-bodyParser"); const Koa = require("koa"); const koaStatic = require("koa-static&

Springboot 使用Jwt token失效时接口无响应(乌龙)

问题背景:新项目使用Springboot框架,鉴权使用了Jwt 处理cors: @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedMetho

存储机制 cookie session jwt token

cookieCookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的规范是RFC 6265,它是一个由浏览器服务器共同协作实现的规范. Cookie的处理分为: 服务器像客户端发送cookie 浏览器将cookie保存 之后每次http请求浏览器都会将cookie发送给服务器端 session1. 为什么要有session的出现?答:是由于网络中htt

jwt Token验证与解析

网上似乎没有相关代码 贴上一段Token的解析认证 [TestMethod] public void TestMethod1() { string Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJMb2dpblR5cGUiOiLlvq7kv6HnmbvlvZUiLCJJc09uZSI6IkZhbHNlIiwiSUQiOiIxMDc2NDYyODY4OTQzMjEyNTQzIiwiUGhvbmUiOiIxMSIsIkVtYWlsIjoiMzMyMS

webapi中使用token验证(JWT验证)

本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get("api/token?username=cuong&password=1").then(function (res) { // 返回一个token /* token示例如下 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZ

Go实战--golang中使用JWT(JSON Web Token)

http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cookie 今天就来跟大家简单介绍一下golang中如何使用token,当然是要依赖一下github上的优秀的开源库了. 首先,要搞明白一个问题,token.cookie.session的区别. token.cookie.session的区别 Cookie Cookie总是保存在客户端中,按在客户端中的存