Я решил использовать библиотеку bshaffer для OAuth2.0 (https: //bshaffer.github. io / oauth2-server-php-docs /). Я использую его для реализации типа предоставления учетных данных клиента для моего API. При запросе токена доступа (с использованием жестко заданных client_id и client_secret) все работает нормально. Я прохожу следующее

grant_type => client_credentials
client_id => oauthuser
client_secret => xkJ7ua2p9zaRQ78YxYAfTCKGUaGEfMS6

Что приводит к следующему:

{
  "access_token": "855b36508abfdfcd25281e36020ab48917d4a637",
  "expires_in": 3600,
  "token_type": "Bearer",
  "scope": null
}

Но всякий раз, когда я запрашиваю свои данные, используя это как заголовок:

authorization => Bearer 855b36508abfdfcd25281e36020ab48917d4a637

Я получаю сообщение об ошибке, что мои токены недействительны:

{
  "error": "invalid_token",
  "error_description": "The access token provided is invalid"
}

Что я делаю неправильно? Можно ли использовать тип предоставления client_credentials без типа разрешения авторизации, как показано в демонстрационном приложении?

Вот часть моего кода:

Для файла, который инициализирует сервер OAuth 2.0:

namespace App\Libraries;

use Silex\Application;
use Silex\ControllerProviderInterface;
use OAuth2\Storage\Memory as OAuth2MemoryStoraage;
use OAuth2\Server as OAuth2Server;
use OAuth2\GrantType\ClientCredentials;
use OAuth2\HttpFoundationBridge\Response as BridgeResponse;

class OAuth2Library implements ControllerProviderInterface
{
    public function setup(Application $app)
    {
        $clients = array('oauthuser' => array(
            'client_secret' => 'xkJ7ua2p9zaRQ78YxYAfTCKGUaGEfMS6'
        ));
        $storage = new OAuth2MemoryStoraage(array('client_credentials' => $clients));

        $server = new OAuth2Server($storage, array('issuer' => $_SERVER['HTTP_HOST']));

        $server->addGrantType(new ClientCredentials($storage));

        $app['oauth_server'] = $server;

        $app['oauth_response'] = new BridgeResponse();
    }

    public function connect(Application $app)
    {
        $this->setup($app);

        $routing = $app['controllers_factory'];
        $routing->post('/accesstoken', 'App\\Controllers\\OAuthController::authorize');

        return $routing;
    }
}

Для функции, выдающей токены доступа (это в другом файле):

namespace App\Controllers;

use OAuth2;
use Silex\Application;
use Symfony\Component\HttpFoundation\Response;
use OAuth2\HttpFoundationBridge\Request as BridgeRequest;

class OAuthController
{
    public function authorize(Application $app)
    {
        $server = $app['oauth_server'];
        $response = $app['oauth_response'];
        return $server->handleTokenRequest($app['request'], $response);
        //return $app->json($encoded, 200);
    }
}

И, наконец, в еще одном файле функция, которая получает ресурсы:

namespace App\Controllers;

use Silex\Application;
use Symfony\Component\HttpFoundation\Response;
use OAuth2;

class HelloController
{
    public function get(Application $app)
    {
        $server = $app['oauth_server'];
        $response = $app['oauth_response'];
        if (!$server->verifyResourceRequest($app['request'], $response)) {
            return $server->getResponse();
        }
        else
        {
            $result = $app['db']->fetchAssoc("select * from user");
            return new Response(json_encode($result));
        }
    }
}

Что я делаю не так? Благодарность!

3
dagitab 22 Апр 2016 в 13:57

2 ответа

Лучший ответ

OAuth2 \ Storage \ Memory не сохраняется между запросами, поэтому вам нужно использовать базу данных (например, OAuth2 \ Storage \ Pdo) для хранения access_tokens.

Вы можете использовать SQLite как один файл с PDO для тестирования: sqlite.org/onefile.html

3
smoq 8 Авг 2016 в 10:49

Вы можете реализовать хранилище MySQL PDO следующим образом

$dsn      = 'mysql:dbname=my_oauth2_db;host=localhost';
$username = 'root';
$password = '';

// error reporting (this is a demo, after all!)
ini_set('display_errors',1);error_reporting(E_ALL);

// Autoloading (composer is preferred, but for this example let's just do this)
require_once('oauth2-server-php/src/OAuth2/Autoloader.php');
OAuth2\Autoloader::register();

// $dsn is the Data Source Name for your database, for exmaple "mysql:dbname=my_oauth2_db;host=localhost"
$storage = new OAuth2\Storage\Pdo(array('dsn' => $dsn, 'username' => $username, 'password' => $password));

// Pass a storage object or array of storage objects to the OAuth2 server class
$server = new OAuth2\Server($storage);

// Add the "Client Credentials" grant type (it is the simplest of the grant types)
$server->addGrantType(new OAuth2\GrantType\ClientCredentials($storage));

Источник: Руководство по серверу BShaffer Oauth2

0
bmatovu 13 Июл 2016 в 09:12