使用Laravel JWT定制有效负载

rak*_*btg 7 php jwt laravel laravel-5 laravel-5.3

我使用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;
Run Code Online (Sandbox Code Playgroud)

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

以下是我尝试使用自定义有效负载生成令牌的方法.

        $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 ] );
Run Code Online (Sandbox Code Playgroud)

但在回复中,令牌是空的!这是回复

{
  "token": {}
}
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

我想要实现的是在现有令牌中添加一些额外的字段,在阅读Laravel JWT-auth doc之后,我发现我需要创建另一个令牌,该令牌会有其他字段,但新令牌不会返回其他字段.

W K*_*nny 8

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

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

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

    dd(auth()->payload()->get('foo'));
Run Code Online (Sandbox Code Playgroud)


Ren*_*unt 5

尝试下面的代码对我有用.

//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);
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码获得组织.

$payload = JWTAuth::parseToken()->getPayload();
// then either of
$payload->get('organization');
Run Code Online (Sandbox Code Playgroud)

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

试试这段代码我希望这段代码对你有用.

您可以从这里获得更多细节.


Fre*_*lli 5

该解决方案在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]);
Run Code Online (Sandbox Code Playgroud)

上面的代码将返回一个表示以下内容的令牌:

{
    "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
}
Run Code Online (Sandbox Code Playgroud)