У меня странная проблема с аутентификацией по паспорту при развертывании моего приложения на новом сайте, несмотря на то, что раньше у меня не было проблем с этим.
Я использую функцию предоставления пароля Passport для входа в приложение (Laravel 5.4). Это происходит, когда пользователь отправляет свое имя пользователя / пароль в формате JSON на сайт, а оттуда он отправляет эти учетные данные в OAuth / токен, чтобы получить ключ API для сайта. Раньше это работало нормально, и мои ключи OAuth зафиксированы в репозитории.
На днях мне удалось развернуть сайт на новом сервере (с теми же ключами OAuth), восстановить (я думаю) ключ приложения, загрузить мои данные с зашифрованными паролями, и проверка подлинности сработала нормально. Однако сегодня я сделал то же самое в другой ветке, и теперь вход в систему возвращает 401 Unauthorized.
Я сделал почти все перестановки, которые только мог придумать: удалить ключи OAuth, восстановить ключ приложения, переустановить паспорт, и все же приложение отказывается входить в систему. Я не верю, что это имеет какое-либо отношение к исходному коду, потому что никаких изменений Я сделал в этой ветке, это повлияет на систему входа в систему.
Я даже попытался скопировать ключ приложения рабочего сайта, а ключи OAuth на сломанный сайт по-прежнему не работают.
Что меня еще больше озадачивает, так это то, что у меня есть другой сайт с ключом приложения другой, ключами другой OAuth, но с теми же данными, и система входа в систему работает нормально.
Я недостаточно понимаю пакет league / oauth2, чтобы понять, почему он не работает. Что мне не хватает?
Спасибо, Мэтт
Вы используете маршруты в web.php или api.php? Также какой тип промежуточного программного обеспечения выполняет ваши проверки? Стандартный Auth: Api? Нужны подробности.
@ delboy1978uk Я считаю, что URL-адрес обратного вызова - это просто localhost; возможно, установка этого вручную может помочь?
@BradGoldsmith маршрут, который фактически отправляет внутренние сообщения в / oauth / token, находится в web.php. Промежуточным программным обеспечением Web являются EncryptCookies, AddQueuedCookiesToResponse, ShareErrorsFromSession, SubstituteBindings. Api - это просто throttle:60,1, а auth:api
@mkrell хорошо, плохо, я неправильно прочитал вопрос, прошу прощения. У меня была очень похожая проблема, когда я предоставлял client_credentials для клиентов, чтобы попасть в мой API. Вы пробовали php Artisan Passport: ключи для восстановления ключей шифрования паспорта?
@BradGoldsmith У меня действительно есть, но я думаю, что я понял причину по предложению коллеги. Неисправный сайт на самом деле является попыткой переместить существующий сайт на новый сервер (так что сломанный сайт имеет тот же домен), но DNS фактически не изменился. В моем коде написано, что нужно отправить сообщение на url('/oauth/token'). Другими словами .... на старый сайт.






Что ж, плохой код не окупается.
Я не упомянул, что сайт, который я пытаюсь развернуть, представляет собой попытку перенести домен на новый сервер. И неработающий сайт, и его активный дочерний сайт имеют одно и то же доменное имя. Это код, который отправляется на конечную точку /oauth/token моих собственных доменов:
$username = Input::json('username');
$password = Input::json('password');
$page = Input::get('page');
$client = Client::find(2);
$http = new GuzzleHttp\Client();
try {
$response = $http->post(url('oauth/token'), [ # <-- see the problem?
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => $client->secret,
'username' => $username,
'password' => $password,
'scope' => '',
],
]);
#...
Проблема довольно забавная. Поскольку DNS для сайта еще не переключился, запросы к моему собственному сайту собираетесь на старый сайт, а не на этот. Значит, я возвращаюсь к Unauthenticated. Потому что я не такой.
Решением было отредактировать файл /etc/hosts на сервере, чтобы указать домен на самого себя. Таким образом, любые вызовы его собственного api фактически перейдут к его собственному api. Задача решена.
Проверьте URL-адрес обратного вызова в API для вашего клиента. Если вы сейчас находитесь в другой домнайне, вам нужно это изменить.