Я пытаюсь реализовать OAuth2 с доктрина в качестве менеджера организации. Я точно следовал этому уроку:
http://bshaffer.github.io/oauth2-server-php-docs/cookbook/doctrine2/
Вот мой код, который вызывается, когда пользователь делает запрос к API:
// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);
$clientStorage = $entityManager->getRepository('OAuthClient');
$clients = $clientStorage->findAll();
print_r($clients); // We are getting the clients from the database.
$userStorage = $entityManager->getRepository('OAuthUser');
$accessTokenStorage = $entityManager->getRepository('OAuthAccessToken');
$authorizationCodeStorage = $entityManager->getRepository('OAuthAuthorizationCode');
$refreshTokenStorage = $entityManager->getRepository('OAuthRefreshToken');
//Pass the doctrine storage objects to the OAuth2 server class
$server = new \OAuth2\Server([
'client_credentials' => $clientStorage,
'user_credentials' => $userStorage,
'access_token' => $accessTokenStorage,
'authorization_code' => $authorizationCodeStorage,
'refresh_token' => $refreshTokenStorage,
], [
'auth_code_lifetime' => 30,
'refresh_token_lifetime' => 30,
]);
$server->addGrantType(new OAuth2\GrantType\ClientCredentials($clientStorage));
// handle the request
$server->handleTokenRequest(OAuth2\Request::createFromGlobals())->send();
Всякий раз, когда выполняется вызов с использованием правильных учетных данных, я получаю такой ответ:
Array
(
[0] => OAuthClient Object
(
[id:OAuthClient:private] => 1
[client_identifier:OAuthClient:private] => testclient
[client_secret:OAuthClient:private] => testpass
[redirect_uri:OAuthClient:private] => http://fake.com
[hashOptions:protected] => Array
(
[cost] => 11
)
)
[1] => OAuthClient Object
(
[id:OAuthClient:private] => 2
[client_identifier:OAuthClient:private] => trevor
[client_secret:OAuthClient:private] => hutto
[redirect_uri:OAuthClient:private] => https://www.another.com
[hashOptions:protected] => Array
(
[cost] => 11
)
)
)
{"error":"invalid_client","error_description":"The client credentials are invalid"}
Таким образом, мы получаем клиентов из базы данных, мы должны проверять их и возвращать, что они действительно существуют, и выдавать токен доступа. Однако по какой-то причине OAuth2 Server (можно увидеть Вот) не может сопоставить данные учетных данных с сохраненными учетными данными.
Я не думаю, что это проблема Doctrine, потому что я могу довольно легко получить результаты, используя findAll ().
Мой вопрос:
Почему это происходит, и как я могу это исправить?
Я нашел проблему. В учебнике (http://bshaffer.github.io/oauth2-server-php-docs/cookbook/doctrine2/) они не упоминают об этом, когда секрет клиента сверяется с хешированной версией предоставленного секрета клиента.
В учебном пособии они не хэшируют пример клиентского секрета, когда помещают его в базу данных.
Если при вставке в базу данных вы хэшируете свой клиентский секрет, он будет работать как положено.
Других решений пока нет …