Пользовательская полезная нагрузка с Laravel JWT

Я использую 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 я понял, что мне нужно создать еще один токен, который будет иметь дополнительные поля, но новый токен не возвращает дополнительные поля .


person rakibtg    schedule 05.11.2016    source источник


Ответы (6)


Попробуйте ниже код работает для меня.

//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, передав объект пользователя.

попробуйте этот код, я надеюсь, что этот код работает для вас.

Вы можете получить более подробную информацию здесь .

person Renish Khunt    schedule 05.11.2016
comment
С этим методом доступна только информация о пользователе, никаких других полей :( - person rakibtg; 05.11.2016
comment
У вас есть идентификатор пользователя? - person Renish Khunt; 05.11.2016
comment
Да, у меня есть идентификатор пользователя - person rakibtg; 05.11.2016
comment
тогда вы можете легко загрузить информацию о пользователе из базы данных, используя пользовательскую модель, например User::find( $user_id ) - person Renish Khunt; 05.11.2016
comment
Но мне нужно добавить настраиваемые поля в качестве полезной нагрузки. - person rakibtg; 05.11.2016
comment
Вы хотите передать свои настраиваемые поля, я обновлю свой ответ, пожалуйста, проверьте, является ли он полным для вас. также вы можете передать свои пользовательские утверждения функции JWTAuth::fromUser. или удалите неиспользуемые данные из массива и добавьте только payloadable все остальные данные, которые вы можете получить из пользовательского объекта. - person Renish Khunt; 05.11.2016
comment
Все работает, но добавленной организации поля нет в токене - person rakibtg; 05.11.2016
comment
Я обновляю свой ответ, попробуйте этот код для получения значения organization. - person Renish Khunt; 05.11.2016

Вы возвращаете $token, но вместо этого используете $token->get().

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

Это должно вызвать функцию __toString().

person schellingerht    schedule 05.11.2016
comment
Ошибка: вызов функции-члена get() для строки - person rakibtg; 05.11.2016
comment
$токен должен быть экземпляром Tymon\JWTAuth\Token - person schellingerht; 05.11.2016

Как я добавляю пользовательскую полезную нагрузку в свой контроллер:

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

Как я возвращаю свою пользовательскую полезную нагрузку:

    dd(auth()->payload()->get('foo'));
person W Kenny    schedule 01.02.2019

Это решение было протестировано на 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
}
person Fred Vanelli    schedule 22.06.2020

Если вы используете jwt в login. Почему бы вам не попробовать $customClaims при попытке входа в систему. попытка позаботится обо всем остальном, чтобы сгенерировать токен.

JWTAuth::attempt(array $credentials = [], array $customClaims = [])
person vijaykumar    schedule 05.11.2016
comment
Почему токен не возвращает другие поля? - person rakibtg; 05.11.2016

я создаю токен, используя только кодирование, у меня такая же проблема, поэтому я просто меняю тип созданного токена на строку.

return response()->json( [ 'token' => (string) $token ] );
person EeetM    schedule 26.06.2019