使用 tymon jwt-auth 出现 "payload does not contain the required claims” 问题的解决方法

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

这两种方式在实际使用过程中,不是能完全满足需求,通过自定义数组的方式可以灵活定义我们所需要验证和直接取所需要的字段

    原文作者:Mr_NeverDie
    原文地址: https://www.jianshu.com/p/eb27652b6c08
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞