byjg / jwt-session
JwtSession 是一个 PHP 会话替代品。它不是使用文件系统,而是使用 JWT 令牌。该实现遵循 SessionHandlerInterface。
Requires
- php: >=8.0
- byjg/jwt-wrapper: 4.9.*
Requires (Dev)
- phpunit/phpunit: 5.7.*|7.4.*|^9.6
This package is auto-updated.
Last update: 2024-09-11 21:11:50 UTC
README
JwtSession 是一个 PHP 会话替代品。它不是使用文件系统,而是使用 JWT 令牌。该实现遵循 SessionHandlerInterface。
如何使用
在 session_start() 之前使用以下命令
<?php $sessionConfig = (new \ByJG\Session\SessionConfig('your.domain.com')) ->withSecret('your super base64url encoded secret key'); $handler = new \ByJG\Session\JwtSession($sessionConfig); session_set_save_handler($handler, true);
现在,所有您的 $_SESSION
变量都将直接保存到 JWT 令牌中!!
密钥
请确保您提供的是 base64url 编码的密钥。
动机
默认的 PHP 会话在具有轮询或其他算法的不同服务器上无法工作。这是因为 PHP 会话默认保存在文件系统中。
有一些实现可以将会话保存到 REDIS 或 MEMCACHED,例如。但这需要您创建一个新的服务器来存储这些会话,并创建了一个单点故障。为了避免这种情况,您必须创建 REDIS/MEMCACHED 集群。
但是,如果您将会话保存到 JWT 令牌中,您就不需要创建新的服务器。只需使用它即可。
您可以在 Codementor 的这篇文章中了解更多信息:使用 JSON Web Token (JWT) 作为 PHP 会话
安全信息
JWT 令牌不能被更改,但它可以被读取。此实现将 JWT 保存到客户端 Cookie 中。
因此,不要 将敏感数据(如密码)存储在 JWT 令牌中。
安装
composer require "byjg/jwt-session"
设置 JWT 令牌的有效期
<?php $sessionConfig = (new \ByJG\Session\SessionConfig('your.domain.com')) ->withSecret('your super base64url encoded secret key') ->withTimeoutMinutes(60); // You can use withTimeoutHours(1) $handler = new \ByJG\Session\JwtSession($sessionConfig); session_set_save_handler($handler, true);
设置不同的会话上下文
<?php $sessionConfig = (new \ByJG\Session\SessionConfig('your.domain.com')) ->withSecret('your super base64url encoded secret key') ->withSessionContext('MYCONTEXT'); $handler = new \ByJG\Session\JwtSession($sessionConfig); session_set_save_handler($handler, true);
创建处理程序并替换会话处理程序
<?php $sessionConfig = (new \ByJG\Session\SessionConfig('your.domain.com')) ->withSecret('your super base64url encoded secret key') ->replaceSessionHandler(); $handler = new \ByJG\Session\JwtSession($sessionConfig);
指定 Cookie 域
<?php $sessionConfig = (new \ByJG\Session\SessionConfig('your.domain.com')) ->withSecret('your super base64url encoded secret key') ->withCookie('.mydomain.com', '/') ->replaceSessionHandler(); $handler = new \ByJG\Session\JwtSession($sessionConfig);
使用 RSA 公钥/私钥
<?php $secret = <<<PRIVATE -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA5PMdWRa+rUJmg6QMNAPIXa+BJVN7W0vxPN3WTK/OIv5gxgmj 2inHGGc6f90TW/to948LnqGtcD3CD9KsI55MubafwBYjcds1o9opZ0vYwwdIV80c OVZX1IUZFTbnyyKcXeFmKt49A52haCiy4iNxcRK38tOCApjZySx/NzMDeaXuWe+1 nd3pbgYa/I8MkECa5EyabhZJPJo9fGoSZIklNnyq4TfAUSwl+KN/zjj3CXad1oDT 7XDDgMJDUu/Vxs7h3CQI9zILSYcL9zwttbLnJW1WcLlAAIaAfABtSZboznsStMnY to01wVknXKyERFs7FLHYqKQANIvRhFTptsehowIDAQABAoIBAEkJkaQ5EE0fcKqw K8BwMHxKn81zi1e9q1C6iEHgl8csFV03+BCB4WTUkaH2udVPJ9ZJyPArLbQvz3fS wl1+g4V/UAksRtRslPkXgLvWQ2k8KoTwBv/3nn9Kkozk/h8chHuii0BDs30yzSn4 SdDAc9EZopsRhFklv9xgmJjYalRk02OLck73G+d6MpDqX56o2UA/lf6i9MV19KWP HYip7CAN+i6k8gA0KPHwr76ehgQ6YHtSntkWS8RfVI8fLUB1UlT3HmLgUBNXMWkQ ZZbvXtNOt6NtW/WIAHEYeE9jmFgrpW5jKJSLn5iGVPFZwJIZXRPyELEs9NHWkS6e GmdzxnECgYEA8+m05B/tmeZOuMrPVJV9g+aBDcuxmW+sdLRch+ccSmx4ZNQOLVoU klYgTZq/a1O4ENq0h2WgccNlRHdcH4sXMBvLalA/tFhZMUuA/KXWyZ1F0hBnjHVF cj1alHCqh+9qJDGdn4mxSmrp8p0rfeWgBwlFtJEJmjjDWDCtVY+JZcsCgYEA8EuV WF/ilgDjgC4jMCYNuO0oFGBbtNP17PuU3kh8W+joqK/nufZ3NLy1WrDIpqa9YPex 328Nnjljf5GJWSdMchAp82waLzl7FaaBTY0iyFAK4J0jfC/fVLx82+wpM3utDnh8 9x5iIboO5U7uEJ7k8X2p64GoprlKJSRmGAJ7eIkCgYEAw5IsXI3NMY0cqcbUHvoO PehgqfMdX+3O1XSYjM+eO35lulLdWzfTLtKn7BGcUi46dCkofzfZQd5uIEukLhaU bRqcK45UxgHg4kmsDufaJKZaCWjl3hVZrZPMQSFlWsF41bSCshzxbr3y/3lOGhA4 E+w3W+S/Uk0ZNGkzUltYy6kCgYEA0gRNeBr9z7rhG4O3j3qC3dCxCfYZ0Na8hy5v M0PJJQ9QYTa04iyOjVItcyE1jaoHtLtoA+9syJBB7RoHIBufzcVg1Pbzf7jOYeLP +jbTYp3Kk/vjKsQwfj/rJM+oRu3eF9qo5dbxT6btI++zVGV7lbEOFN6Sx30EV6gT bwKkZXkCgYEAnEtN43xL8bRFybMc1ZJErjc0VocnoQxCHm7LuAtLOEUw6CwwFj9Q GOl+GViVuDHUNQvURLn+6gg4tAemYlob912xIPaU44+lZzTMHBOJBGMJKi8WogKi V5+cz9l31uuAgNfjL63jZPaAzKs8Zx6R3O5RuezympwijCIGWILbO2Q= -----END RSA PRIVATE KEY----- PRIVATE; $public = <<<PUBLIC -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5PMdWRa+rUJmg6QMNAPI Xa+BJVN7W0vxPN3WTK/OIv5gxgmj2inHGGc6f90TW/to948LnqGtcD3CD9KsI55M ubafwBYjcds1o9opZ0vYwwdIV80cOVZX1IUZFTbnyyKcXeFmKt49A52haCiy4iNx cRK38tOCApjZySx/NzMDeaXuWe+1nd3pbgYa/I8MkECa5EyabhZJPJo9fGoSZIkl Nnyq4TfAUSwl+KN/zjj3CXad1oDT7XDDgMJDUu/Vxs7h3CQI9zILSYcL9zwttbLn JW1WcLlAAIaAfABtSZboznsStMnYto01wVknXKyERFs7FLHYqKQANIvRhFTptseh owIDAQAB -----END PUBLIC KEY----- PUBLIC; $sessionConfig = (new \ByJG\Session\SessionConfig('example.com')) ->withRsaSecret($secret, $public) ->replaceSessionHandler(); $handler = new \ByJG\Session\JwtSession($sessionConfig);
如果您想了解更多关于如何创建 RSA 公钥/私钥的详细信息,请访问:https://github.com/byjg/jwt-wrapper
工作原理
我们存储一个名为 AUTH_BEARER_
的 Cookie,后面跟着上下文名称和会话名称。PHPSESSID Cookie 仍然被创建,因为 PHP 默认创建它,但我们不使用它;