Используйте Laravel / Passport в качестве OAUTH2-провайдера и войдите в систему, используя социальные сети. - PullRequest
0 голосов
/ 14 апреля 2020

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