使用 Laravel JWT 的自定义负载

Custom payload with Laravel JWT

我正在使用 Laravel 5.3 和 laravel jwt 作为令牌,这里是控制器使用的命名空间列表。

use JWTAuth;
use App\Http\Requests;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTFactory;
use Tymon\JWTAuth\Exceptions\JWTException;

我需要添加自定义负载数据来生成令牌。

以下是我尝试使用自定义负载生成令牌的方式。

        $payloadable = [
            'id' => $tokenPayload->id,
            'name' => $tokenPayload->name,
            'email' => $tokenPayload->email,
            'deleted_at' => $tokenPayload->deleted_at,
            'created_at' => $tokenPayload->created_at,
            'updated_at' => $tokenPayload->updated_at,
            'organization' => $request->organization_id
        ];

        // Generate the token.
        $token = JWTAuth::encode( JWTFactory::make( $payloadable ) );

        // Return token.
        return response()->json( [ 'token' => $token ] );

但是在响应中令牌是空的!这是回应

{
  "token": {}
}

为什么它返回一个空令牌而不是 jwt 令牌!

更新:

现在我可以使用 JWTFactory 命名空间之前的 \ 获取令牌,但是我如何才能获取更新后的令牌值?

我想要实现的是向现有令牌添加一些附加字段,在阅读 Laravel JWT-auth 文档后,我发现我需要创建另一个具有附加字段的令牌但新令牌未返回其他字段。

试试下面的代码对我有用。

//load user place your code for load user
$user = User::find( $user_id );
// if you don't have user id then also you can used.
$user = User::where( 'email', $tokenPayload->email )->first();

$payloadable = [
        'id' => $tokenPayload->id,
        'name' => $tokenPayload->name,
        'email' => $tokenPayload->email,
        'deleted_at' => $tokenPayload->deleted_at,
        'created_at' => $tokenPayload->created_at,
        'updated_at' => $tokenPayload->updated_at,
        'organization' => $request->organization_id
    ];

$token = JWTAuth::fromUser($user,$payloadable);

您可以使用以下代码获取组织。

$payload = JWTAuth::parseToken()->getPayload();
// then either of
$payload->get('organization');

您可以使用 fromUser 方法通过传递用户对象来获取新令牌。

试试这个代码我希望这个代码对你有用。

You can get more detail from here.

您 return $token,但使用 $token->get() 代替。

return response()->json(['token' => $token->get()]);

这应该调用 __toString()。

如果您在登录时使用 jwt。 为什么不在登录时尝试 $customClaims 呢?该尝试将处理生成令牌的所有其他事情。

JWTAuth::attempt(array $credentials = [], array $customClaims = [])

我在控制器中添加自定义负载的方式:

    $customClaims = ['foo' => 'bar', 'baz' => 'bob'];
    $token = JWTAuth::claims($customClaims)->attempt($credentials);

我取回自定义负载的方式:

    dd(auth()->payload()->get('foo'));

我正在仅使用编码创建令牌,遇到同样的问题,所以我只是将创建的令牌的类型更改为有效的字符串。

return response()->json( [ 'token' => (string) $token ] );

此解决方案已在 tymon/jwt-auth 1.0.0

上测试
use JWTAuth;
use Tymon\JWTAuth\Facades\JWTFactory;

//...

$user = User::find(1);

$payload = JWTFactory::sub($user->id)
    ->myCustomString('Foo Bar')
    ->myCustomArray(['Apples', 'Oranges'])
    ->myCustomObject($user)
    ->make();

$token = JWTAuth::encode($payload);

return response()->json(['token' => $token]);

上面的代码将 return 一个代币代表:

{
    "iss": "http://yourdomain.com", //Automatically inserted
    "iat": 1592808100,              //Automatically inserted
    "exp": 1592811700,              //Automatically inserted
    "nbf": 1592808100,              //Automatically inserted
    "jti": "wIyXAEvPk64nyH3C"       //Automatically inserted
    "sub": 1,                       //User ID (required)
    "myCustomString": "Foo Bar",
    "myCustomArray":  ["Apples", "Oranges"],
    "myCustomObject": { ... } //Full $user object
}