oauth — Руководство по реализации PHP-сервера Oauth2 с использованием библиотеки phpleague

я использую Slim Framework С Eloquent ORM. Пытаясь реализовать https://github.com/thephpleague/oauth2-server но я совершенно запутался, как это сделать. После добавления этого с помощью composer я создал базу данных с файлом sql, предоставленным в этом пакете.

Теперь предлагается реализовать интерфейсы хранения. Я не хочу этого делать, поэтому я просто скопировал классы хранения, найденные в папке примеров. Я думаю, они должны работать, так как я использую ту же базу данных, верно?

Также неясно, как изначально посеять БД. Вот мой роутер, где я пытаюсь password метод.

$server = new \League\OAuth2\Server\AuthorizationServer;

$server->setSessionStorage(new SessionStorage);
$server->setAccessTokenStorage(new AccessTokenStorage);
$server->setClientStorage(new ClientStorage);
$server->setScopeStorage(new ScopeStorage);

$passwordGrant = new \League\OAuth2\Server\Grant\PasswordGrant();
$passwordGrant->setVerifyCredentialsCallback(function ($username, $password) {
// implement logic here to validate a username and password, return an ID if valid, otherwise return false
return 1;
});

$server->addGrantType($passwordGrant);

$app->post('/token',function() use ($server,$app){
try{
$response = $server->issueAccessToken();

$res = $app->response();
$res['Content-Type'] = 'application/json';

$res->body(json_encode($response));

} catch (\Exception $e) {

var_dump($e);
}

});

Я полностью разочарован тем, что происходит.
Это бросает следующее исключение. [Я добавил область ok в дБ]

object(League\OAuth2\Server\Exception\InvalidScopeException)[82]
public 'httpStatusCode' => int 400
public 'errorType' => string 'invalid_scope' (length=13)
public 'serverShouldRedirect' => boolean true
protected 'message' => string 'The requested scope is invalid, unknown, or malformed. Check the "ok" scope.' (length=76)
private 'string' (Exception) => string '' (length=0)
protected 'code' => int 0
protected 'file' => string 'C:\wamp\www\linkshare\vendor\league\oauth2-server\src\Grant\AbstractGrant.php' (length=77)
protected 'line' => int 163
private 'trace' (Exception) =>
array (size=11)
0 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\league\oauth2-server\src\Grant\PasswordGrant.php' (length=77)
'line' => int 130
'function' => string 'validateScopes' (length=14)
'class' => string 'League\OAuth2\Server\Grant\AbstractGrant' (length=40)
'type' => string '->' (length=2)
'args' =>
array (size=2)
...
1 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\league\oauth2-server\src\AuthorizationServer.php' (length=77)
'line' => int 330
'function' => string 'completeFlow' (length=12)
'class' => string 'League\OAuth2\Server\Grant\PasswordGrant' (length=40)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
2 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\index.php' (length=31)
'line' => int 67
'function' => string 'issueAccessToken' (length=16)
'class' => string 'League\OAuth2\Server\AuthorizationServer' (length=40)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
3 =>
array (size=2)
'function' => string '{closure}' (length=9)
'args' =>
array (size=0)
...
4 =>
array (size=4)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Route.php' (length=53)
'line' => int 462
'function' => string 'call_user_func_array' (length=20)
'args' =>
array (size=2)
...
5 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Slim.php' (length=52)
'line' => int 1326
'function' => string 'dispatch' (length=8)
'class' => string 'Slim\Route' (length=10)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
6 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Middleware\Flash.php' (length=64)
'line' => int 85
'function' => string 'call' (length=4)
'class' => string 'Slim\Slim' (length=9)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
7 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Middleware\MethodOverride.php' (length=73)
'line' => int 92
'function' => string 'call' (length=4)
'class' => string 'Slim\Middleware\Flash' (length=21)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
8 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Middleware\PrettyExceptions.php' (length=75)
'line' => int 67
'function' => string 'call' (length=4)
'class' => string 'Slim\Middleware\MethodOverride' (length=30)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
9 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\vendor\slim\slim\Slim\Slim.php' (length=52)
'line' => int 1271
'function' => string 'call' (length=4)
'class' => string 'Slim\Middleware\PrettyExceptions' (length=32)
'type' => string '->' (length=2)
'args' =>
array (size=0)
...
10 =>
array (size=6)
'file' => string 'C:\wamp\www\linkshare\index.php' (length=31)
'line' => int 131
'function' => string 'run' (length=3)
'class' => string 'Slim\Slim' (length=9)
'type' => string '->' (length=2)
'args' =>
array (size=0)

3

Решение

OAuth 2.0 очень сложно понять и правильно использовать. На самом деле, лидер OAuth 2.0 классно ушел от протокола после нескольких лет разработки для него. По словам Эрана Хаммера (вышеупомянутого ведущего разработчика):

По сравнению с OAuth 1.0 спецификация 2.0 является более сложной,
менее совместимый, менее полезный, более неполный и наиболее
главное, менее безопасно.

Чтобы быть ясным, OAuth 2.0 от руки разработчика с глубоким
понимание веб-безопасности, скорее всего, приведет к
реализация. Тем не менее, в руках большинства разработчиков — как это было
опыт последних двух лет — 2.0, скорее всего, даст
небезопасные реализации.

Излишне говорить, что в OAuth 2.0 есть некоторые разногласия. Алекс Билби, ведущий разработчик платформы OAuth 2.0-сервера PHP League, по-видимому, является одним из наиболее знающих разработчиков для OAuth 2.0, хотя, несомненно, есть и другие. Тем не менее, имея в виду одну из самых больших жалоб Hammer — отсутствие функциональной совместимости и полноты — вы, вероятно, захотите найти следующее в реализации OAuth 2.0:

  • Активное развитие
  • Полное соответствие OAuth 2.0

Я лично использую и рекомендую OAuth 2.0-сервер Алекса Билби, который теперь включает в себя токены-носители MAC и нацелен на полную совместимость. Также активно развивается.

Итак, что это значит для вашего проекта? Читайте о спецификациях. Пакет, который мы используем, претендует на полную совместимость, что означает, что ваш лучший ресурс Спецификация OAuth 2.0 сам. Есть также достойная документация под Сайт PHP Лиги это может помочь вам с этой конкретной реализацией.

При этом, возможно, вам не хватает Scope для вашей комбинации клиент / пользователь. Как OAuth2.0 структурирован, ваш пользователь должен принимать области, которые запрашивает клиент. Это означает, что ваши «области видимости» должны быть связаны в других ваших таблицах. Если «ОК» не одобрено пользователем (в БД), то оно не будет одобрено.

редактировать

Похоже, прицелы не проблема для вас. Это место не очень подходит для устранения неполадок, поэтому я советую вам убедиться, что у вас установлена ​​самая последняя версия любой среды, которую вы решите использовать, и сообщать о любых ошибках разработчику (в PHPLeague это происходит через Github).

13

Другие решения

Прошло довольно много лет с тех пор, как этот вопрос был задан, но вот ссылки на библиотеки OAuth2 для Slim 3:

-1

По вопросам рекламы [email protected]