我使用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之后,我发现我需要创建另一个令牌,该令牌会有其他字段,但新令牌不是返回其他字段。
答案 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
方法获取新令牌。
尝试此代码我希望此代码适合您。
答案 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 ] );