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

Я использую Slim Framework с Eloquent ORM. Пытаюсь реализовать https://github.com/thephpleague/oauth2-server, но я совершенно запутался как это сделать. После добавления этого с помощью композитора я создал базу данных с файлом 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)

person Tejas    schedule 11.10.2014    source источник


Ответы (2)


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

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

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

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

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

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

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

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

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

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

person smcjones    schedule 26.10.2014
comment
Спасибо за подробное объяснение. Мне очень поможет! - person Tejas; 07.11.2014
comment
Я немного опоздал на вечеринку, но почему этот комментарий был заминусован? - person Mave; 24.02.2015
comment
Я ненавижу эту особенность SA... Люди могут голосовать против, абсолютно не отвечая. Очень пассивно-агрессивен и не может помочь вопрошающему или отвечающему. Я отредактировал свой вопрос и, надеюсь, он касается всего, что людям не нравится. - person smcjones; 28.02.2015
comment
@Mave Потому что это на самом деле не отвечает на вопрос. Любой может скопировать и вставить какой-нибудь текст, указать на книгу и спецификации. Спрашивающий попросил руководства с тем, что у них есть, а не какой-то произвольный ответ, прочитанный в этой книге. - person adamj; 22.06.2018

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

person adamj    schedule 22.06.2018