defineweb/google-oauth2

简单的Google oAuth2组件

安装: 115

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

dev-master / 0.1.x-dev 2017-03-19 22:11 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:26:43 UTC


README

screenshot

待办事项

  • 检查当权限被撤销时无效的刷新令牌响应

安装

  1. 启用组件
  2. 添加配置
  3. 包含路由
  4. 扩展AccessToken和RefreshToken的自定义属性
  5. 创建TokenProvider

步骤 1:安装/启用组件

php app/console cache:clear
<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Defineweb\Bundle\GoogleOauth2Bundle\GoogleOauth2Bundle(),
    );
}

步骤 2:配置

# app/config/config.yml
google_oauth2:
    app_id:          %google_app_id%
    app_secret:      %google_app_secret%
    hosted_domain:   %google_hosted_domain% 
    redirect_uri:    google_oauth2_callback  # Url or route id
    scope:
        - https://www.googleapis.com/auth/cloudprint
        # Available scopes: https://developers.google.com/identity/protocols/googlescopes

在Google开发者环境中创建/配置一个应用: https://console.developers.google.com/apis/credentials

# app/config/parameters.yml
google_app_id:          ******.apps.googleusercontent.com
google_app_secret:      *************
google_hosted_domain:   https://yourdomain.com

步骤 3:包含路由

使用yml导入路由

# app/config/routing.yml

# Optional status route
google_oauth2_status:
    path: /google-oauth/status
    defaults:
        _controller: GoogleOauth2Bundle:OAuth:status
    
google_oauth2:
    resource: "@GoogleOauth2Bundle/Resources/config/routing.xml"
    prefix: /google-oauth
    

使用xml

<!-- app/config/routing.xml -->
<!-- Optional status route -->
<route id="google_oauth_status" path="/google-oauth/status">
    <default key="_controller">GoogleOauth2Bundle:OAuth:status</default>
</route>

<import resource="@GoogleOauth2Bundle/Resources/config/routing.xml"/>

步骤 4:扩展AccessToken和RefreshToken的自定义属性

<?php
// src/Acme/AppBundle/Entity/AccessToken.php

namespace Acme\AppBundle\Entity;

use Defineweb\Bundle\GoogleOauth2Bundle\Entity\AccessToken as BaseAccessToken;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class AccessToken extends BaseAccessToken
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Your\Own\Entity\User")
     */
    protected $user;
}
<?php
// src/Acme/AppBundle/Entity/RefreshToken.php

namespace Acme\AppBundle\Entity;

use Defineweb\Bundle\GoogleOauth2Bundle\Entity\RefreshToken as BaseRefreshToken;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class RefreshToken extends BaseRefreshToken
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Your\Own\Entity\User")
     */
    protected $user;
}

步骤 5:创建TokenProvider

<?php

namespace Acme\AppBundle\Provider;

use Acme\AppBundle\Entity\AccessToken;
use Acme\AppBundle\Entity\RefreshToken;
use Defineweb\Bundle\GoogleOauth2Bundle\Provider\TokenProviderInterface;
use Doctrine\ORM\EntityManager;

class TokenProvider implements TokenProviderInterface
{
    /**
     * @var EntityManager
     */
    protected $entityManager;
    
    /**
     * Your own user provider or some other logic
     */
    protected $userProvider;

    public function __construct(EntityManager $em, UserProvider $userProvider)
    {
        $this->entityManager = $em;
        $this->userProvider = $userProvider;
    }

    /**
     * {@inheritdoc}
     */
    public function getAccessToken()
    {
        $result = $this->entityManager->getRepository('AppBundle:AccessToken')->findBy(
            ['user' => $this->userProvider->getUser()],
            ['expiresAt' => 'desc'],
            1
        );

        return key_exists(0, $result) ? $result[0] : null;
    }

    /**
     * {@inheritdoc}
     */
    public function getRefreshToken()
    {
        $result = $this->entityManager->getRepository('AppBundle:RefreshToken')->findBy(
            ['user' => $this->userProvider->getUser()],
            ['id' => 'desc'],
            1
        );

        return key_exists(0, $result) ? $result[0] : null;
    }

    /**
     * {@inheritdoc}
     */
    public function createAccessToken()
    {
        return new AccessToken();
    }

    /**
     * {@inheritdoc}
     */
    public function createRefreshToken()
    {
        return new RefreshToken();
    }
}

使用google_oauth2.token_provider标签将此TokenProvider注册为服务

<service id="app.provider.token" class="Acme\AppBundle\Provider\TokenProvider">
    <argument type="service" id="doctrine.orm.entity_manager"/>
    <!--<argument type="service" id="your_user_provider"/>-->
    <tag name="google_oauth2.token_provider"/>
</service>