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之后,我发现我需要创建另一个令牌,该令牌会有其他字段,但新令牌不会返回其他字段.
我在控制器中添加自定义负载的方式:
$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)
尝试下面的代码对我有用.
//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通过传递用户对象来获取使用方法的新令牌.
试试这段代码我希望这段代码对你有用.
该解决方案在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)