使用Laravel JWT定制有效负载

时间:2016-11-05 07:28:39

标签: php laravel laravel-5 jwt 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;

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

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

        $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 doc之后,我发现我需要创建另一个令牌,该令牌会有其他字段,但新令牌不是返回其他字段。

6 个答案:

答案 0 :(得分: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);

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

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

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

尝试此代码我希望此代码适合您。

You can get more detail from here

答案 1 :(得分:3)

此解决方案已在 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
}

答案 2 :(得分:2)

您返回$令牌,但改为使用$ token-> get()。

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

这应该调用__toString()。

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

如果您在登录时使用jwt。 为什么登录时不尝试 public class ayncClass extends AsyncTask<String, Void, String> { public void onPreExecute(){ } @Override protected String doInBackground(String... params) { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(URL HERE); try{ HttpResponse responseGiven = client.execute(get); StatusLine statusLine = responseGiven.getStatusLine(); int statusCode = statusLine.getStatusCode(); if(statusCode == 404){ Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show(); } } catch(Exception e){ } return null; } public void onPostExecute(...){ super.onPostExecute(s); } } 。尝试将注意所有其他事项以生成令牌。

$customClaims

答案 5 :(得分:0)

我仅使用编码创建令牌,但存在相同的问题,因此我只是将创建的令牌的类型更改为字符串有效。

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