jwt-auth是一个laravel/lumen上的jwt库
在wiki
中有根据任何自定义字段来创建一个token的方法,官方代码如下:
//token生成
$customClaims = ['foo' => 'bar', 'baz' => 'bob'];
$payload = JWTFactory::make($customClaims);
$token = JWTAuth::encode($payload);
这种写法会报题目上的错误,下面这种写法可以把自定义字段包裹在sub
里,并把token
解码后取出,从而解决这个问题
//token生成
$customClaims = ['sub' => [
'foo' => 'bar'
]];
$payload = JWTFactory::customClaims($customClaims)->make();
$token = JWTAuth::encode($payload);
//token解码
JWTAuth::setToken($token)->getPayload()->get('sub') //结果:['foo' => 'bar']
为什么要自定义生成和自定义解码
因为通过JWTAuth::attempt
的方式,会触发一次数据库查询,去查询对应字段的记录是否存在,随后生成token
;
JWTAuth::fromUser
的方式,是根据一个JWTObject来生成,在不指定JWTCustomClaims
的时候,sub
只会包裹对象的主键,在验证的时候会根据主键去查询对应的object
这两种方式在实际使用过程中,不是能完全满足需求,通过自定义数组的方式可以灵活定义我们所需要验证和直接取所需要的字段