PHP利用JWT实现token和refresh_token

0. 引入

composer require firebase/php-jwt

require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;

1. 生成token

public function getToken()
{
    $key = 'key';  // key
    $time = time();  // 当前时间
    $token = [
        'iss' => 'http://www.buddha.com',  // 签发者 可选
        'aud' => 'http://www.buddha.com',  // 接收该JWT的一方,可选
        'iat' => $time,  // 签发时间
        'nbf' => $time ,  // (Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
        'exp' => $time + 7200,  // 过期时间,这里设置2个小时
        'data' => [  // 自定义信息,不要定义敏感信息
            'id' => 1,
            'username' => 'buddha'
        ]
    ];
    return JWT::encode($token, $key);  // 输出Token
}

2. 验证token

public function verification()
{
    $key = 'key';  // key要和签发的时候一样
    $jwt = "";  // 签发的Token
    try {
        JWT::$leeway = 60;  // 当前时间减去60,把时间留点余地
        $decoded = JWT::decode($jwt, $key, ['HS256']);  // HS256方式,这里要和签发的时候对应
        $arr = (array)$decoded;
        return $arr;
    } catch(\Firebase\JWT\SignatureInvalidException $e) {  // 签名不正确
        echo $e->getMessage();
    }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
        echo $e->getMessage();
    }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
        echo $e->getMessage();
    }catch(Exception $e) {  // 其他错误
        echo $e->getMessage();
    }
    // Firebase定义了多个throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务
    // 比如token过期可以用当前Token刷新一个新Token
}

3. 同时生成token和refresh_token

public function authorizations()
{
    $key = 'ffdsfsd@4_45';  // key
    $time = time();  // 当前时间

    // 自定义信息
    $token = [
        'iss' => 'http://www.buddha.com',  // 签发者 可选
        'iat' => $time,  // 签发时间
        'data' => [  // 自定义信息,不要定义敏感信息
            'id' => 1,
            'username' => 'buddha'
        ]
    ];

    $access_token = $token;
    $access_token['scopes'] = 'role_access';  // token标识,请求接口的token
    $access_token['exp'] = $time + 7200;  // access_token过期时间,这里设置2个小时

    $refresh_token = $token;
    $refresh_token['scopes'] = 'role_refresh';  // token标识,刷新access_token
    $refresh_token['exp'] = $time + (86400 * 30);  // access_token过期时间,这里设置30天

    $jsonList = [
        'access_token' => JWT::encode($access_token, $key),
        'refresh_token' => JWT::encode($refresh_token, $key),
        'token_type' => 'bearer'  // token_type:表示令牌类型,该值大小写不敏感,这里用bearer
    ];
    // header("HTTP/1.1 201 Created");
    return json_encode($jsonList);  // 返回给客户端token信息
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JWT_REFRESH_TOKEN_EXPIRES 是一个用于设置 JWT 刷新令牌过期时间的变量,它通常与 JWT_ACCESS_TOKEN_EXPIRES 一起使用。下面是一个使用 Flask-JWT-Extended 扩展的例子: ```python from flask import Flask from flask_jwt_extended import JWTManager, create_access_token, create_refresh_token, jwt_required, jwt_refresh_token_required, get_jwt_identity, get_raw_jwt app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置 JWT 密钥 app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600 # 设置访问令牌过期时间为 1 小时 app.config['JWT_REFRESH_TOKEN_EXPIRES'] = 604800 # 设置刷新令牌过期时间为 1 周 jwt = JWTManager(app) # 用户登录,生成访问令牌和刷新令牌 @app.route('/login', methods=['POST']) def login(): username = request.json.get('username', None) password = request.json.get('password', None) if username != 'admin' or password != 'admin': return jsonify({'msg': 'Invalid username or password'}), 401 access_token = create_access_token(identity=username) refresh_token = create_refresh_token(identity=username) return jsonify({'access_token': access_token, 'refresh_token': refresh_token}), 200 # 使用访问令牌访问受保护的资源 @app.route('/protected', methods=['GET']) @jwt_required def protected(): current_user = get_jwt_identity() return jsonify({'msg': f'Hello, {current_user}!'}), 200 # 使用刷新令牌刷新访问令牌 @app.route('/refresh', methods=['POST']) @jwt_refresh_token_required def refresh(): current_user = get_jwt_identity() access_token = create_access_token(identity=current_user) return jsonify({'access_token': access_token}), 200 if __name__ == '__main__': app.run() ``` 在上面的例子中,我们设置了 JWT_REFRESH_TOKEN_EXPIRES 为 1 周,表示刷新令牌在 1 周后过期。当用户登录成功后,我们生成了一个访问令牌和一个刷新令牌,并将它们返回给客户端。当客户端使用访问令牌访问受保护的资源时,我们使用 @jwt_required 装饰器来保护该路由,只有在客户端提供有效的访问令牌时才能访问。当客户端的访问令牌过期时,客户端可以使用刷新令牌来获取新的访问令牌,我们使用 @jwt_refresh_token_required 装饰器来保护刷新令牌路由,只有在客户端提供有效的刷新令牌时才能刷新访问令牌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员buddha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值