此包已被弃用且不再维护。作者建议使用authbucket/oauth2-php包。

基于Symfony组件的标准合规OAuth2.0库

5.0.0-alpha4 2017-06-20 14:18 UTC

README

Build Status Coverage Status Dependency Status Latest Stable Version Total Downloads License

AuthBucket\OAuth2的主要目标是开发一个符合标准的RFC6749 OAuth2.0库;次要目标是开发相应的Symfony2 BundleDrupal模块

此库包含一个基于SilexAuthBucketOAuth2ServiceProvider,用于单元测试和演示目的。安装和使用方法如下。

安装

如果您使用Composer来管理项目的依赖项,只需将authbucket/oauth2-php添加到项目的composer.json文件中即可。

以下是一个composer.json的简单示例

{
    "require": {
        "authbucket/oauth2-php": "~5.0"
    }
}

参数

捆绑的AuthBucketOAuth2ServiceProvider包含以下参数

  • authbucket_oauth2.model:(可选)用您自己的模型类覆盖此参数,默认使用内存中的AccessToken,用于使用带有远程调试端点的资源防火墙。
  • authbucket_oauth2.model_manager.factory:(可选)用您后端模型管理器覆盖此参数,例如,使用Doctrine ORM EntityRepository,默认使用内存实现,用于使用带有远程调试端点的资源防火墙。
  • authbucket_oauth2.user_provider:(可选)对于使用grant_type = password,用您自己的用户提供者覆盖此参数,例如,使用InMemoryUserProvider或实现UserProviderInterface的Doctrine ORM EntityRepository。

服务

捆绑的AuthBucketOAuth2ServiceProvider包含以下服务控制器,它简化了OAuth2.0控制器实现的复杂性

  • authbucket_oauth2.authorization_controller:授权端点控制器。
  • authbucket_oauth2.token_controller:令牌端点控制器。
  • authbucket_oauth2.debug_controller:调试端点控制器。

注册

如果您使用Silex,请按以下方式注册AuthBucketOAuth2ServiceProvider

$app->register(new AuthBucket\OAuth2\Silex\Provider\AuthBucketOAuth2ServiceProvider());

此外,如果尚未启用以下服务提供者,请启用它们

$app->register(new Silex\Provider\MonologServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->register(new Silex\Provider\ValidatorServiceProvider());

使用方法

此库将端点逻辑分为前端防火墙和后端控制器视角,因此您需要同时设置两者才能使其正常工作。

要启用内置控制器及其相应的路由,您需要手动挂载它

$app->get('/api/oauth2/authorize', 'authbucket_oauth2.authorization_controller:indexAction')
    ->bind('api_oauth2_authorize');

$app->post('/api/oauth2/token', 'authbucket_oauth2.token_controller:indexAction')
    ->bind('api_oauth2_token');

$app->match('/api/oauth2/debug', 'authbucket_oauth2.debug_controller:indexAction')
    ->bind('api_oauth2_debug');

以下是涵盖一些常见用例的配方列表。

授权端点

我们不为此端点提供自定义防火墙,您应该自行保护它,通过验证和捕获用户凭据来保护它,例如通过 SecurityServiceProvider

$app['security.default_encoder'] = function ($app) {
    return new Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder();
};

$app['security.user_provider.default'] = $app['security.user_provider.inmemory._proto']([
    'demousername1' => ['ROLE_USER', 'demopassword1'],
    'demousername2' => ['ROLE_USER', 'demopassword2'],
    'demousername3' => ['ROLE_USER', 'demopassword3'],
]);

$app['security.firewalls'] = [
    'api_oauth2_authorize' => [
        'pattern' => '^/api/oauth2/authorize$',
        'http' => true,
        'users' => $app['security.user_provider.default'],
    ],
];

令牌端点

与授权端点类似,我们需要使用自定义防火墙 oauth2_token 来保护此端点

$app['security.firewalls'] = [
    'api_oauth2_token' => [
        'pattern' => '^/api/oauth2/token$',
        'oauth2_token' => true,
    ],
];

调试端点

我们应该使用自定义防火墙 oauth2_resource 来保护此端点

$app['security.firewalls'] = [
    'api_oauth2_debug' => [
        'pattern' => '^/api/oauth2/debug$',
        'oauth2_resource' => true,
    ],
];

资源端点

除了上面的调试端点之外,我们不提供其他资源端点控制器实现。您应该考虑实现自己的端点,带有自定义逻辑,例如获取用户电子邮件地址或个人资料图片。

另一方面,您可以使用我们的自定义防火墙 oauth2_resource 来保护您的资源服务器端点。简短版本(默认假设资源服务器与授权服务器捆绑在一起,查询本地模型管理器,不提供范围保护)

$app['security.firewalls'] = [
    'api_resource' => [
        'pattern' => '^/api/resource',
        'oauth2_resource' => true,
    ],
];

长版本(假设资源服务器与授权服务器捆绑在一起,查询本地模型管理器,使用范围 demoscope1 进行保护)

$app['security.firewalls'] = [
    'api_resource' => [
        'pattern' => '^/api/resource',
        'oauth2_resource' => [
            'resource_type' => 'model',
            'scope' => ['demoscope1'],
        ],
    ],
];

如果授权服务器托管在其他地方,您可以通过查询远程授权服务器调试端点来保护您的本地资源端点

$app['security.firewalls'] = [
    'api_resource' => [
        'pattern' => '^/api/resource',
        'oauth2_resource' => [
            'resource_type' => 'debug_endpoint',
            'scope' => ['demoscope1'],
            'options' => [
                'debug_endpoint' => 'http://example.com/api/oauth2/debug',
                'cache' => true,
            ],
        ],
    ],
];

演示

此演示基于 SilexAuthBucketOAuth2ServiceProvider。阅读 演示 了解更多信息。

您还可以在本地运行此演示。打开控制台并执行以下命令来安装 oauth2-php 目录中的最新版本

$ composer create-project authbucket/oauth2-php authbucket/oauth2-php "~5.0"

然后使用 PHP 内置的 Web 服务器来运行演示应用程序

$ cd authbucket/oauth2-php
$ ./bin/console server:run

如果您遇到错误 There are no commands defined in the "server" namespace.,那么您可能正在使用 PHP 5.3。没关系!但是内置的 Web 服务器仅适用于 PHP 5.4.0 或更高版本。如果您有较旧的 PHP 版本或您更喜欢传统的 Web 服务器(如 Apache 或 Nginx),请阅读 配置 Web 服务器 文章。

打开您的浏览器并访问 http://127.0.0.1:8000 URL 以查看演示应用程序的欢迎页面。

还可以访问 http://127.0.0.1:8000/admin/refresh_database 以使用用户帐户 admin:secrete 初始化捆绑的 SQLite 数据库。

文档

OAuth2 的文档使用 Sami 构建,并公开托管在 GitHub Pages 上。

要本地构建文档,请执行以下命令

$ sami.php update .sami.php

使用浏览器打开 build/sami/index.html 以查看文档。

测试

该项目包含 PHPUnit 测试用例;CI 结果可在 Travis CI 上找到;代码覆盖率报告可在 Coveralls 上找到。

要本地运行测试套件,请执行以下命令

$ phpunit -c phpunit.xml.dist

使用浏览器打开 build/logs/html 以查看覆盖率报告。

参考文献

许可证

  • 代码遵循MIT许可证发布
  • 文档遵循CC BY 4.0许可证发布