Я хотел бы войти в систему пользователя, который существует на одном Laravel -app на другом сайте.
On Laravel -Prodiver Я создал новый OAuth-клиент:
mysql> select * from oauth_clients;
+----+---------+-----------------------------------+------------------------------------------+-------------------------------------------+------------------------+-----------------+---------+---------------------+---------------------+
| id | user_id | name | secret | redirect | personal_access_client | password_client | revoked | created_at | updated_at |
+----+---------+-----------------------------------+------------------------------------------+-------------------------------------------+------------------------+-----------------+---------+---------------------+---------------------+
| 1 | NULL | Accounting Personal Access Client | 1231231231231231231231231231231231231231 | http://localhost | 1 | 0 | 0 | 2020-02-09 14:24:32 | 2020-02-09 14:24:32 |
| 2 | NULL | Accounting Password Grant Client | 1231231231231231231231231231231231231231 | http://laravel-client.test/oauth/callback | 0 | 1 | 0 | 2020-02-09 14:24:32 | 2020-02-09 14:24:32 |
| 3 | NULL | Password Grant Client | 1231231231231231231231231231231231231231 | http://localhost | 0 | 1 | 0 | 2020-04-14 12:30:21 | 2020-04-14 12:30:21 |
+----+---------+-----------------------------------+------------------------------------------+-------------------------------------------+------------------------+-----------------+---------+---------------------+---------------------+
On Laravel -prodiver Я добавил Passport::routes();
к AuthServiceProvider
.
| | GET|HEAD | api/user/{id?} | api.user.view | App\Http\Controllers\UserApiController@view | api,auth:api |
| | GET|HEAD | oauth/authorize | passport.authorizations.authorize | Laravel\Passport\Http\Controllers\AuthorizationController@authorize | web,auth |
| | POST | oauth/authorize | passport.authorizations.approve | Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve | web,auth |
| | DELETE | oauth/authorize | passport.authorizations.deny | Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny | web,auth |
| | POST | oauth/clients | passport.clients.store | Laravel\Passport\Http\Controllers\ClientController@store | web,auth |
| | GET|HEAD | oauth/clients | passport.clients.index | Laravel\Passport\Http\Controllers\ClientController@forUser | web,auth |
| | DELETE | oauth/clients/{client_id} | passport.clients.destroy | Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth |
| | PUT | oauth/clients/{client_id} | passport.clients.update | Laravel\Passport\Http\Controllers\ClientController@update | web,auth |
| | POST | oauth/personal-access-tokens | passport.personal.tokens.store | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store | web,auth |
| | GET|HEAD | oauth/personal-access-tokens | passport.personal.tokens.index | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser | web,auth |
| | DELETE | oauth/personal-access-tokens/{token_id} | passport.personal.tokens.destroy | Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy | web,auth |
| | GET|HEAD | oauth/scopes | passport.scopes.index | Laravel\Passport\Http\Controllers\ScopeController@all | web,auth |
| | POST | oauth/token | | Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | throttle |
| | POST | oauth/token/refresh | passport.token.refresh | Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
| | GET|HEAD | oauth/tokens | passport.tokens.index | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth |
| | DELETE | oauth/tokens/{token_id} | passport.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth |
| | GET|HEAD | {any} | | App\Http\Controllers\ApplicationController | web |
Итак, если я сейчас открою http://laravel-provider.test/oauth/authorize
, меня перенаправят на мою домашнюю страницу.
Если я добавлю маршрут без промежуточного программного обеспечения auth
, например:
Route::get('oauth/authorize', '\Laravel\Passport\Http\Controllers\AuthorizationController@authorize');
Route::get('/{any}', 'ApplicationController')->where('any', '.*');
Я могу получить доступ к маршруту и создать перенаправление Socialite, например:
return Socialite::with('laravelpassport')->setConfig($config)
->redirect();
В этом случае я получаю эту ошибку:
Error
Call to a member function getKey() on null
http://laravel-provider.test/oauth/authorize?client_id=2&redirect_uri=http%3A%2F%laravel-client.test%2Foauth%2Fcallback&response_type=code&scope=&state=4TUCV7HLfSROjoF1AShmseQZybRB8XbuKX9vM1mZ
Это часть, где возникает ошибка:
**
* Find a valid token for the given user and client.
*
* @param \Illuminate\Database\Eloquent\Model $user
* @param \Laravel\Passport\Client $client
* @return \Laravel\Passport\Token|null
*/
public function findValidToken($user, $client)
{
return $client->tokens()
->whereUserId($user->getKey())
->where('revoked', 0)
->where('expires_at', '>', Carbon::now())
->latest('expires_at')
->first();
}
Мои вопросы:
- Что я здесь не так делаю? Почему мой маршрут не вызывается? Правильно ли я полагаю, что промежуточное программное обеспечение не работает здесь?
- Как я могу "открыть" Passport, чтобы пользователи могли входить на сторонние веб-сайты?
- Почему здесь используется промежуточное ПО по умолчанию
auth
и как я могу гарантировать, что люди смогут войти в систему с помощью Socialite?