alb/oauth2-server-bundle

该包已被弃用且不再维护。未建议替代包。
该包最新版本(dev-master)的许可证信息不可用。

Symfony2 OAuth2 服务器包

安装: 9

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 3

分支: 452

类型:symfony-bundle

dev-master 2011-12-15 14:03 UTC

This package is auto-updated.

Last update: 2023-11-29 15:09:28 UTC


README

Build Status

安装

安装是一个快速6步骤的过程

  1. 下载 AlbOAuth2ServerBundle
  2. 配置自动加载器
  3. 启用包
  4. 创建用户类
  5. 配置应用的安全.yml
  6. 配置 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:配置自动加载器

AlbOAuth2 命名空间添加到您的自动加载器中

<?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

您的工作是首先为您的应用程序创建这些类。这些类可以看起来和表现方式任您选择:添加任何您认为有用的属性或方法。

这些类只有一些要求

  1. 它们必须扩展来自包的基本类之一
  2. 它们必须有一个 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 端点添加默认控制器

鸣谢