【问题标题】:Custom payload with Laravel JWT使用 Laravel JWT 自定义负载
【发布时间】:2017-03-19 01:33:22
【问题描述】:

我使用 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 文档后,我发现我需要创建另一个令牌,该令牌将具有额外的字段,但新令牌不是返回其他字段。

【问题讨论】:

    标签: php laravel laravel-5 jwt laravel-5.3


    【解决方案1】:

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

    //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.

    【讨论】:

    • 只有用户信息可用此方法没有其他字段:(
    • 你有用户ID吗?
    • 是的,我有用户 ID
    • 那么您可以使用User::find( $user_id )等用户模型轻松地从数据库中加载用户信息
    • 但我需要添加自定义字段作为有效负载。
    【解决方案2】:

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

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

    这应该调用 __toString()。

    【讨论】:

    • 错误:在字符串上调用成员函数 get()
    • $token 应该是Tymon\JWTAuth\Token的实例
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      此解决方案已在 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]);
      

      上面的代码将返回一个表示:

      {
          "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
      }
      

      【讨论】:

        【解决方案5】:

        如果您在登录时使用 jwt。 为什么不尝试登录时尝试$customClaims。尝试将处理其他一切以生成令牌。

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

        【讨论】:

        • 为什么令牌没有返回其他字段?
        【解决方案6】:

        我只使用编码创建令牌,有同样的问题,所以我只是将创建的令牌的类型更改为字符串工作。

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

        【讨论】:

          猜你喜欢
          • 2020-06-27
          • 2017-03-20
          • 2017-02-17
          • 2018-04-11
          • 2017-10-24
          • 2011-12-17
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多