Я использую Laravel Framework версии 5.3.9, новая загрузка ничего не добавляется через композитор (кроме "laravel/passport": "^1.0"
).
Я сделал все, что было предложено в docs. Создаются таблицы, маршруты вверх, все работает нормально. Однако мне нужен паспорт для API.
Мои маршруты выглядят так:
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/v1/users/register | api::users::register | App\Http\Controllers\Api\V1\[email protected] | api,auth |
| | POST | oauth/authorize | | \Laravel\Passport\Http\Controllers\Appro[email protected] | web,auth |
| | GET|HEAD | oauth/authorize | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | DELETE | oauth/authorize | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | GET|HEAD | oauth/clients | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | POST | oauth/clients | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | PUT | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | GET|HEAD | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | POST | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | DELETE | oauth/personal-access-tokens/{token_id} | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | GET|HEAD | oauth/scopes | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\[email protected] | |
| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | GET|HEAD | oauth/tokens | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
| | DELETE | oauth/tokens/{token_id} | | \Laravel\Passport\Http\Controllers\[email protected] | web,auth |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
Все маршруты web
есть, существует никаких связанных с api
маршрутов, так как Passport не предоставляет ничего такого типа из коробки.
Сам API предназначен для использования доверенным клиентом, который он сделал для мобильного приложения, которое требует входа в систему, однако указанный логин обойдет несколько шагов.
Как только пользователь обращается к маршруту /register
, сам процесс регистрации довольно прост: получить доступ к учетной записи пользователя facebook, чтобы захватить несколько полей - адрес электронной почты, идентификатор facebook, имя изображения профиля и с этого момента пользователи считаются зарегистрировано. Но у пользователя будет НЕ логин с facebook (это очень важный аспект). В потребительском приложении будет выпущен токен и он будет использовать этот токен для доступа к различным конечным точкам api (для которых требуется использовать токен).
Таким образом, это сводится к этому. Мне нужно предоставить токен доступа к потребительскому приложению, доступ к API. Сам API будет иметь только одного клиента, то есть самого мобильного приложения. Пользователи, которые используют приложение, не считаются клиентами API, а сами клиенты самого мобильного приложения.
Пока Паспорт - это головная боль, с которой нужно работать, когда дело доходит до реализации связанных с API материалов, либо это, либо я не могу понять, как заставить его работать должным образом.
Я создал тестовый клиент в таблице oauth_clients
, который выглядит так:
Я использую Postman для доступа к маршруту api/v1/users/register
, у которого есть промежуточное ПО auth
со следующим JSON application/json
{
"grant_type" : "authorization_code",
"client_id" : 5,
"client_secet": "y5dvPIOxQJOjYn7w2zzg4c6TRrphsrNFWbG4gAUL"
}
Что, конечно, приведет к
{"error":"Unauthenticated."}
Это имеет смысл.
Из чистого любопытства я изменил маршрут /register
на это:
Route::group([
'middleware' => [
],
], function ()
{
Route::group([
'prefix' => 'users',
'as' => 'users::',
], function ()
{
// Route::get('/register', ['as' => 'register', 'uses' => 'Api\V1\[email protected]',]);
Route::post('/register', ['as' => 'register', 'uses' => '\Laravel\Passport\Http\Controllers\[email protected]',]);
});
});
С тем же json
, как и раньше. Это привело к {"error":"invalid_client","message":"Client authentication failed"}
.
Я отследил функцию, которая, я думаю, обрабатывает часть validateClient
в vendor/league
oauth2-server/src/Grant/AbstractGrant`.
$client
имеет значение null. Теперь это может быть или не быть связано с Паспортом, поскольку документация на нем скорее отсутствует и мысль о том, чтобы выкапывать через монстра пакета, чтобы отследить ошибку, которая может быть в значительной степени из-за того, что я не делаю что-то правильно, не ударяет меня как хорошая идея, у меня нет вариантов. Честно говоря, я даже не знаю, в чем проблема.
Действительно, в этот момент любой вид, указывающий в правильном направлении, более чем приветствуется.
Частью в вопросах является