Как войти пользователю с паспортом Laravel охранника водителя? - PullRequest
0 голосов
/ 11 июля 2020

Когда пользователь входит в мой Foo SPA, он перенаправляется на внутреннюю страницу входа Laravel для получения кода доступа и токена через Laravel Passport GET route oauth/authorize. Когда пользователь входит в систему, по какой-то причине он не использует поставщика пользователя, установленного в таблице Passport oauth_clients, установленной для этого SPA.

Что не так, моя конфигурация ниже?

Guard устанавливается в config/auth.php:

'api-foo' => [
    'driver' => 'passport',
    'provider' => 'users-foo'
]

Поставщик в config/auth.php:

'users-foo' => [
    'driver' => 'eloquent',
    'model' => App\Models\Foo\User::class,
],

Модель пользователя App/Models/Foo/User.php:

<?php

namespace App\Models\Foo;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'foo';

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'foo.users';

}

An запись в таблице oauth_clients:

+----+---------+------+--------+----------+------------------------------------+------------------------+-----------------+---------+
| id | user_id | name | secret | provider | redirect                           | personal_access_client | password_client | revoked |
+----+---------+------+--------+----------+------------------------------------+------------------------+-----------------+---------+
|  2 |         | Foo  | ***    | api-foo  | http://foo.test:3001/auth/callback | false                  | false           | false   |
+----+---------+------+--------+----------+------------------------------------+------------------------+-----------------+---------+

Примечание. Я не использую токен предоставления пароля, потому что он небезопасен и устарел в соответствии с рекомендациями oauth. net.

=== РЕДАКТИРОВАТЬ ===

Процесс входа в систему начинается так:

  1. GET {backend}/oauth/authorize:
http://backend.test/oauth/authorize
  ?protocol=oauth2
  &response_type=code
  &access_type
  &client_id=2
  &redirect_uri=
    http%3A%2F%2Ffoo.test%3A3001%2Fauth%2Fcallback
  &scope=*
  &state=nL2aLxjUivVpsqeyaA9KP
  &code_challenge_method=implicit
Предоставляется

client_id, поэтому он может получить защиту аутентификации от провайдера в таблице oauth_clients. Но я могу найти, где хранятся эти данные, в следующем запросе, чтобы установить защиту в моем app/Http/Controllers/Auth/LoginController.php методе attemptLogin().

GET {backend}/login

Введите login и password

POST {backend}/login

GET {backend}/oauth/authorize

http://backend.test/oauth/authorize
  ?access_type=
  &client_id=2
  &code_challenge_method=implicit
  &protocol=oauth2
  &redirect_uri=
    http%3A%2F%2Ffoo.test%3A3001%2Fauth%2Fcallback
  &response_type=code
  &scope=%2A
  &state=NzAefK__Rr--9Q5dX8oRo
GET {spa}/auth/callback
http://foo.test:3001/auth/callback
  ?code=def***3c1
  &state=nL2aLxjUivVpsqeyaA9KP
GET {backend}/api/user
http://backend.test/api/user

1 Ответ

0 голосов
/ 11 июля 2020

С его помощью вы можете получить Токен:

url: {{base_url}}/oauth/token

И отправить этот параметр в теле POST запроса:

grant_type:password

client_id:{{client_id}}

client_secret:{{client_secret}}

username:{{employer_username}}

password:{{employer_password}}

...