Я разрабатываю настраиваемую схему аутентификации (на основе открытых ключей) вместе с API без сохранения состояния и решил, что Passport удовлетворит потребности в запросах после аутентификации.
Предполагая, что аутентификация прошла успешно и пользователь аутентифицирован, они получат токен личного доступа и будут использовать этот токен для всех дальнейших запросов. Проблема, с которой я сталкиваюсь (все еще после долгого поиска по различным форумам и переполнению стека), заключается в том, что при использовании встроенного пакета тестирования Laravel в методе createToken () он генерирует (по общему признанию распространенное) исключение:
ErrorException: попытка получить свойство id не-объекта.
Я могу вручную создать пользователя через Tinker и создать токен через Tinker. Однако у меня возникают проблемы при попытке автоматизировать этот процесс после аутентификации.
Вот соответствующий фрагмент кода после аутентификации:
Auth::login($user);
$user = Auth::user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
$token->expires_at = Carbon::now()->addWeeks(1);
$token->save();
return response()->json([
"access_token" => $tokenResult->accessToken,
"token_type" => "Bearer",
"expires_at" => Carbon::parse(
$tokenResult->token->expires_at)->toDateTimeString()
],
200);
Я вручную вызвал Auth :: login для пользователя, чтобы убедиться, что пользователь вошел в систему, а Auth :: user () возвращает пользователя (не null). После выполнения третьей строки кода возникает исключение со следующей мини-трассировкой стека (при запросе я могу предоставить полную трассировку стека).
laravel\passport\src\PersonalAccessTokenFactory.php:100
laravel\passport\src\PersonalAccessTokenFactory.php:71
laravel\passport\src\HasApiTokens.php:67
app\Http\Controllers\Auth\LoginController.php:97
laravel\framework\src\Illuminate\Routing\Controller.php:54
laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php:45
От запуска этого через отладку несколько раз - даже если класс вызывается и загружается, и кажется, что Клиент найден через ControllerDispatcher - ›Client :: find (id) и найден в ClientRepository, когда он попадает в PersonalAccessTokenFactory, $ client передано значение null (что объясняет, почему $ client- ›id не может быть найден, хотя я понятия не имею, почему в данный момент $ client имеет значение null).
protected function createRequest($client, $userId, array $scopes)
{
$secret = Passport::$hashesClientSecrets ? Passport::$personalAccessClientSecret : $client->secret;
return (new ServerRequest)->withParsedBody([
'grant_type' => 'personal_access',
'client_id' => $client->id,
...
}
Вещи, которые я сделал / попробовал, руководствуясь документацией и другими сообщениями:
- Вручную создал пользователя в Tinker и создал токен через Tinker - это работает.
- Убедитесь, что пользователь вошел в систему, прежде чем пытаться сгенерировать токен.
- Паспорт: установить (и добавив параметр --force)
- Гарантированный персональный доступ Клиент генерируется с паспортом: клиент - персональный
- Убедитесь, что AuthServiceProvider :: boot () содержит ClientID и Client Secret (в .env).
- migrate: refresh, затем паспорт: install --force
- Полное удаление Паспорта, удаление всех файлов, ключей, миграций и записей БД с последующим выполнением миграции: обновление и переустановка Паспорта, а также создание дополнительного клиента персонального доступа (даже если он создается во время установки паспорта).
Я не уверен, где еще искать / что еще попробовать на этом этапе, поэтому любая помощь или руководство будут очень благодарны!
Auth::user()->id;
вместоAuth::user()
- person Sobir   schedule 18.08.2020Auth::user()->id;
возвращает идентификатор текущего авторизованного пользователя. Вы должны создать токен по идентификатору текущего авторизованного пользователя. - person Sobir   schedule 18.08.2020$user = App\User::find(1); // Creating a token without scopes... $token = $user->createToken('Token Name')->accessToken; // Creating a token with scopes... $token = $user->createToken('My Token', ['place-orders'])->accessToken;
Все, что я действительно делал с Auth :: user (), это подтверждало, что пользователь действительно вошел в систему. - person grantley   schedule 18.08.2020$user = App\User::find(1);
1
- этоuser id
. Вы должны использоватьApp\User::find(Auth::user()->id);
//return current logged in user id.
- person Sobir   schedule 18.08.2020