alb / oauth2-server-bundle
Symfony2 OAuth2 服务器包
Requires
- php: >=5.3.2
- alb/oauth2-php: *
- symfony/framework-bundle: 2.*
Suggests
- symfony/doctrine-bundle: *
- symfony/mongodb-odm-bundle: *
This package is auto-updated.
Last update: 2023-11-29 15:09:28 UTC
README
安装
安装是一个快速6步骤的过程
- 下载 AlbOAuth2ServerBundle
- 配置自动加载器
- 启用包
- 创建用户类
- 配置应用的安全.yml
- 配置 AlbOAuth2ServerBundle
步骤1:下载 AlbOAuth2ServerBundle 和 oauth2-php
最终,应将 AlbOAuth2ServerBundle 文件下载到 vendor/bundles/Alb/OAuth2ServerBundle
目录,而 oauth2-php 文件则下载到 vendor/oauth2-php
目录。
这可以通过几种方式完成,具体取决于您的偏好。第一种方法是标准的 Symfony2 方法。
使用 vendors 脚本
在您的 deps
文件中添加以下行
[AlbOAuth2ServerBundle]
git=git://github.com/arnaud-lb/AlbOAuth2ServerBundle.git
target=bundles/Alb/OAuth2ServerBundle
[oauth2-php]
git=git://github.com/arnaud-lb/oauth2-php.git
现在,运行 vendors 脚本来下载包
$ php bin/vendors install
使用子模块
如果您更喜欢使用 git 子模块,则运行以下命令
$ git submodule add git://github.com/arnaud-lb/AlbOAuth2ServerBundle.git vendor/bundles/Alb/OAuth2ServerBundle $ git submodule add git://github.com/arnaud-lb/oauth2-php.git vendor/oauth2-php $ git submodule update --init
步骤2:配置自动加载器
将 Alb
和 OAuth2
命名空间添加到您的自动加载器中
<?php // app/autoload.php $loader->registerNamespaces(array( // ... 'Alb' => __DIR__.'/../vendor/bundles', 'OAuth2' => __DIR__.'/../vendor/oauth2-php/lib', ));
步骤3:启用包
最后,在 kernel 中启用包
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Alb\OAuth2ServerBundle\AlbOAuth2ServerBundle(), ); }
步骤4:创建模型类
此包需要将一些类持久化到数据库中
OAuth2Client
(OAuth2消费者)OAuth2AccessToken
OAuth2AuthCode
您的工作是首先为您的应用程序创建这些类。这些类可以看起来和表现方式任您选择:添加任何您认为有用的属性或方法。
这些类只有一些要求
- 它们必须扩展来自包的基本类之一
- 它们必须有一个
id
字段
在以下章节中,您将看到根据您如何存储数据,您的类应该如何看起来。
您的类可以位于您的应用程序中的任何包内。例如,如果您在 "Acme" 公司工作,您可能会创建一个名为 AcmeApiBundle
的包,并将您的类放在其中。
警告
如果您在您的类中覆盖了 __construct() 方法,请确保调用 parent::__construct(),因为基本类依赖于它来初始化一些字段。
a) Doctrine ORM 类
如果您通过 Doctrine ORM 持久化数据,那么您的类应位于您的包的 Entity
命名空间中,并如下所示
<?php // src/Acme/ApiBundle/Entity/OAuth2Client.php namespace Acme\ApiBundle\Entity; use Alb\OAuth2Server\Entity\OAuth2Client as BaseOAuth2Client; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class OAuth2Client extends BaseOAuth2Client { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; public function __construct() { parent::__construct(); // your own logic } }
<?php // src/Acme/ApiBundle/Entity/OAuth2AccessToken.php namespace Acme\ApiBundle\Entity; use Alb\OAuth2Server\Entity\OAuth2AccessToken as BaseOAuth2AccessToken; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class OAuth2AccessToken extends BaseOAuth2AccessToken { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="OAuth2Client") * @ORM\JoinColumn(nullable=false) */ protected $client; public function __construct() { parent::__construct(); // your own logic } }
<?php // src/Acme/ApiBundle/Entity/OAuth2AuthCode.php namespace Acme\ApiBundle\Entity; use Alb\OAuth2Server\Entity\OAuth2AuthCode as BaseOAuth2AuthCode; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class OAuth2AuthCode extends BaseOAuth2AuthCode { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="OAuth2Client") * @ORM\JoinColumn(nullable=false) */ protected $client; public function __construct() { parent::__construct(); // your own logic } }
步骤5:配置应用的安全.yml
为了使 Symfony 的安全组件使用 AlbOAuth2ServerBundle,您必须在 security.yml
文件中指定。该 security.yml
文件包含您应用程序安全的基本配置。
以下是使用 AlbOAuth2ServerBundle 在您的应用程序中使用所需的最小配置示例
# app/config/security.yml security: firewalls: api: pattern: ^/api alb_oauth2: true stateless: true access_control: # You can omit this if /api can be accessed both authenticated and anonymously - { path: ^/api, roles: [IS_AUTHENTICATED_FULLY] }
位于 /api
下的 URL 将使用 OAuth2 进行用户认证。
第 6 步:配置 AlbOAuth2ServerBundle
在 app/config/routing.yml 中导入路由配置文件
# app/config/routing.yml alb_oauth2: resource: "@AlbOAuth2ServerBundle/Resources/config/routing.yml"
在 app/config/config.yml 中添加 AlbOAuth2ServerBundle 设置
# app/config/config.yml alb_o_auth2_server: db_driver: orm oauth2_client_class: Acme\ApiBundle\Entity\OAuth2Client oauth2_access_token_class: Acme\ApiBundle\Entity\OAuth2AccessToken oauth2_auth_code_class: Acme\ApiBundle\Entity\OAuth2AuthCode
仅限 Symfony 2.0.x
在 app/config/config.yml 中导入安全配置文件
# app/config/config.yml imports: # Symfony 2.0.x only - { resource: "@AlbOAuth2ServerBundle/Resources/config/security.yml" }
用法
默认情况下,token
端点位于 /oauth/v2/token
(见 Resources/config/routing.yml)。
可以通过在 alb.oauth2.server.server_service
服务上使用 finishClientAuthorization
方法实现 authorize
端点
<?php if ($form->isValid()) { try { $response = $service->finishClientAuthorization(true, $currentUser, $request, $scope); return $response; } catch(\OAuth2\OAuth2ServerException $e) { return $e->getHttpResponse(); } }
待办事项
- 进行更多测试
- 添加 OAuth2RefreshToken 模型类
- 在默认存储适配器中添加 refresh_token 授权类型的方法
- 为 /authorize 端点添加默认控制器
鸣谢
- Arnaud Le Blanc
- 受 BazingaOAuthBundle 和 FOSUserBundle 的启发
- 安装文档改编自 FOSUserBundle 文档。