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 令牌在后续请求中无效,它可能已过期吗?

Laravel / Lumen Auth JWT令牌在后续请求中无效,是否可能已过期?

Lumen5.6使用JWT最新教程,亲身失败百次的总结

具有相同令牌的多个 Laravel-API 的 JWT 身份验证