Laravel 或 Lumen JWT 删除默认声明
Posted
技术标签:
【中文标题】Laravel 或 Lumen JWT 删除默认声明【英文标题】:Laravel or Lumen JWT remove default claims 【发布时间】:2017-11-18 22:52:06 【问题描述】:我正在使用 Tymon 的 JWTAuth 通过令牌以无状态方式将应用程序连接到 api。但问题是,当我解码令牌时,在有效负载数据上,iss
值就是 API url 本身。
如何更改值,以防止将密钥传递给令牌?
这是令牌的解码值(出于示例目的,我只是在此处编辑了值)
"iss": "http://localhost.com/api/",
"iat": 1111111111,
"exp": 2222222222,
"nbf": 3333333333,
"jti": "xxxxxxxxxxxxxx",
"sub": 1234,
"foo": "bar",
"baz": "bob"
我可以添加自定义声明,但无法删除 iss
键。
$token = $jwt->attempt($request->only(['username', 'password']));
$customClaims = ['foo' => 'bar', 'baz' => 'bob'];
$payload = $jwtFactory->customClaims($customClaims)->make(true);
$token = $jwt->encode($payload);
if ($token === false)
echo 'invalid credentials';
else
echo 'valid user';
我什至尝试过:
$jwtFactory->iss('http://example.com')->foo(['lol'])->make();
只有foo
键或更确切地说是“自定义声明”值正在更改,而不是默认声明。但正如documentation 中所述,设置时可以更改默认声明值。
【问题讨论】:
您是否已从 jwt 配置的 required_claims 数组中删除? @JigarShah 是的,我做到了,它仍然包含默认声明。 是的,它会按照 PayloadFactory 中的 defaultClaims @JigarShah 是的,但是有没有办法不包括这些?或者甚至只是将iss
的值设置为其他值而不是请求 url?
【参考方案1】:
我能够通过设置自定义声明来覆盖默认声明的值,其中自定义声明的值是默认声明。
$customClaims = ['iss' => 'xxx', 'baz' => 'bob'];
$payload = $jwtFactory->customClaims($customClaims)->make();
有了这个,iss
(默认声明)的值现在是xxx
。这在documentation 上看起来很奇怪,它有一种不同的方式来重写默认声明,这是行不通的。
【讨论】:
【参考方案2】:要将 iss 值设置为 null 或您可能需要修改 iss()
的任何其他值
public function iss()
return NULL;
// return $this->request->url();
之后你会得到解码后的令牌
array:6 [
"sub" => 4
"iss" => null // I have set value to null
"iat" => 1497603439
"exp" => 1497963439
"nbf" => 1497603439
"jti" => "O6zdDsWKt3X7hszh"
]
编辑
你可以试试这个吗:
if ( !$token = JWTAuth::attempt( $credentials, array( 'iss' => NULL ) ) )
我已经对此进行了测试,它对我有用。同样为此我们不需要在包文件中进行更改
希望有效
【讨论】:
是的,试过了,但我认为这不是最好的方法,因为我们直接修改它。有什么方法可以通过不接触代码库来覆盖它?以上是关于Laravel 或 Lumen JWT 删除默认声明的主要内容,如果未能解决你的问题,请参考以下文章
在没有 Lumen/Laravel 会话的情况下使用 Lumen + Dingo + JWT
Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作
Laravel/Lumen Auth JWT 令牌在后续请求中无效,它可能已过期吗?