Laravel 或 Lumen JWT 删除默认声明

Laravel or Lumen JWT remove default claims

我正在使用 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 键或更确切地说 "custom claims" 值正在更改,但默认声明没有更改。但正如 documentation 中所述,默认声明值可以在设置时更改。

为了将 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 ) ) ) 

我已经用这个测试过,它对我有用。同样为此,我们不需要在包文件中进行更改

希望有用

我能够通过设置自定义声明来覆盖默认声明的值,其中自定义声明的值是默认声明。

$customClaims = ['iss' => 'xxx', 'baz' => 'bob'];
$payload = $jwtFactory->customClaims($customClaims)->make();

有了这个,iss(默认声明)的值现在是 xxx。这在 documentation 上看起来很奇怪,它有一种不同的方式来覆盖无效的默认声明。