PHP code example of yzh52521 / think-jwt
1. Go to this page and download the library: Download yzh52521/think-jwt library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
yzh52521 / think-jwt example snippets
return [
'login_type' => env('JWT_LOGIN_TYPE', 'mpop'), // 登录方式,sso为单点登录,mpop为多点登录
/**
* 单点登录自定义数据中必须存在uid的键值,这个key你可以自行定义,只要自定义数据中存在该键即可
*/
'sso_key' => 'uid',
/**
* 只能用于Hmac包下的加密非对称算法,其它的都会使用公私钥
*/
'secret' => env('JWT_SECRET', 'yzh52521'),
/**
* JWT 权限keys
* 对称算法: HS256, HS384 & HS512 使用 `JWT_SECRET`.
* 非对称算法: RS256, RS384 & RS512 / ES256, ES384 & ES512 使用下面的公钥私钥,需要自己去生成.
*/
'keys' => [
'public' => env('JWT_PUBLIC_KEY'), // 公钥,例如:'file:///path/to/public/key'
'private' => env('JWT_PRIVATE_KEY'), // 私钥,例如:'file:///path/to/private/key'
/**
* 你的私钥的密码。不需要密码可以不用设置
*/
'passphrase' => env('JWT_PASSPHRASE'),
],
'ttl' => env('JWT_TTL', 7200), // token过期时间,单位为秒
/**
* 支持的对称算法:HS256、HS384、HS512
* 支持的非对称算法:RS256、RS384、RS512、ES256、ES384、ES512
*/
'alg' => env('JWT_ALG', 'HS256'), // jwt的hearder加密算法
/**
* jwt使用到的缓存前缀
* 建议使用独立的redis做缓存,这样比较好做分布式
*/
'cache_prefix' => 'think-jwt',
/**
* 是否开启黑名单,单点登录和多点登录的注销、刷新使原token失效,必须要开启黑名单,目前黑名单缓存只支持thinkphp缓存驱动
*/
'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
/**
* 黑名单的宽限时间 单位为:秒,注意:如果使用单点登录,该宽限时间无效
*/
'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
/**
* 签发者
*/
'issued_by' => 'think-jwt',
/**
* 区分不同场景的token,比如你一个项目可能会有多种类型的应用接口鉴权,下面自行定义,我只是举例子
* 下面的配置会自动覆盖根配置,比如app会里面的数据会覆盖掉根数据
* 下面的scene会和根数据合并
* scene必须存在一个default
* 什么叫根数据,这个配置的一维数组,除了scene都叫根配置
*/
'scene' => [
'default' => [
'secret' => 'default', // 非对称加密使用字符串,请使用自己加密的字符串
'login_type' => 'mpop', // 登录方式,sso为单点登录,mpop为多点登录
'sso_key' => 'uid',
'ttl' => 7200, // token过期时间,单位为秒,
'user_model'=>'' //用户模型 为一个匿名函数,默认返回空数组,可以根据自己定制返回模型
],
'app' => [
'secret' => 'app', // 非对称加密使用字符串,请使用自己加密的字符串
'login_type' => 'sso', // 登录方式,sso为单点登录,mpop为多点登录
'sso_key' => 'uid',
'ttl' => 7200, // token过期时间,单位为秒
'user_model'=>function(){ //用户模型 为一个匿名函数,默认返回空数组,可以根据自己定制返回模型
return [];
}
],
]
];
namespace app\controller;
use yzh52521\Jwt\JWT;
use yzh52521\Jwt\Util\JWTUtil;
class Index
{
/**
*
* @Inject
* @var JWT
*/
protected $jwt;
public function __construct()
{
$this->jwt =JWT::class;
}
/**
* 模拟登录 default场景
*/
public function login(Request $request)
{
$username = $request->param('username');
$password = $request->param('password');
if ($username && $password) {
$userData = [
'uid' => 1, // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
'username' => 'xx',
];
// 使用默认场景登录
$token = $this->jwt->getToken('default', $userData);
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'token' => $token->toString(),
'expires_in' => $this->jwt->getTTL($token->toString()),
]
];
return json($data);
}
return json(['code' => 0, 'msg' => '登录失败', 'data' => []]);
}
/**
* 模拟登录 app场景
*/
public function loginApp(Request $request)
{
$username = $request->param('username');
$password = $request->param('password');
if ($username && $password) {
$userData = [
'uid' => 1, // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
'username' => 'xx',
];
// 使用application2场景登录
$token = $this->jwt->getToken('app', $userData);
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
[
'token' => $token->toString(),
'expires_in' => $this->jwt->getTTL($token1->toString()),
'dynamic_exp' => $this->jwt->getTokenDynamicCacheTime($token->toString())
]
]
];
return json($data);
}
return json(['code' => 0, 'msg' => '登录失败', 'data' => []]);
}
/**
* default 场景的刷新token
*/
public function refreshDefaultToken(Request $request)
{
$token = $this->jwt->refreshToken();
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'token' => $token->toString(),
'expires_in' => $this->jwt->getTTL($token->toString()),
]
];
return json($data);
}
/**
* application 场景的刷新token
*
*/
public function refreshAppToken(Request $request)
{
$token = $this->jwt->refreshToken();
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'token' => $token->toString(),
'expires_in' => $this->jwt->getTTL($token->toString()),
]
];
return json($data);
}
/**
* default 场景的删除token
*/
public function logout_default()
{
return $this->jwt->logout();
}
/**
* app 场景的删除token
*
*/
public function logout_app()
{
return $this->jwt->logout();
}
/**
* 只能使用default场景值生成的token访问
*/
public function getDefaultData(Request $request)
{
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'dynamic_exp' => $this->jwt->getTokenDynamicCacheTime(JWTUtil::getToken($request)),
'jwt_claims' => JWTUtil::getParserData($request)
]
];
return json($data);
}
/**
* 只能使用app场景值生成的token访问
*/
public function getAppData(Request $request)
{
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'dynamic_exp' => $this->jwt->getTokenDynamicCacheTime(JWTUtil::getToken($request)),
'jwt_claims' => JWTUtil::getParserData($request)
]
];
return json($data);
}
}
'user_model' => function($uid) {
return \think\facade\Db::table('user')
->field('id,username,create_time')
->where('id',$uid)
->find();
}
shell
return [
yzh52521\Jwt\Middleware\JWTAuthDefaultSceneMiddleware:class,
];
shell
Route::group('/v1', function () {
Route::get('/getToken', 'index/getToken']);
})->middleware(\yzh52521\Jwt\Middleware\JWTAuthDefaultSceneMiddleware::class);
shell
namespace app\controller;
use yzh52521\Jwt\JWT;
class Index
{
# 模拟登录,获取token
public function login(Request $request,Jwt $jwt)
{
$username = $request->param('username');
$password = $request->param('password');
if ($username && $password) {
$userData = [
'uid' => 1, // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
'username' => 'xx',
];
// 使用默认场景登录
$token = $jwt->getToken('default', $userData);
$data = [
'code' => 0,
'msg' => 'success',
'data' => [
'token' => $token->toString(),
'expires_in' => $jwt->getTTL($token->toString()),
]
];
return json($data);
}
return json(['code' => 0, 'msg' => '登录失败', 'data' => []]);
}
# http头部必须携带token才能访问的路由
public function getToken()
{
return json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
}
}
shell
# 登录
Route::post('/login', 'index/login');
# 获取数据
Route::group('/v1', function () {
Route::get('/getToken', 'index/getToken');
})->middleware(yzh52521\Jwt\Middleware\JWTAuthDefaultSceneMiddleware::class);