douxiangshi6568 2014-03-22 14:08
浏览 64

Symfony2 OAuth客户端

I am trying to add this oauth client library "adoy/oauth2" to symfony to connect with my OAuth2 enable API. This is what I have done so far.

1) composer.json

"require": {
    "adoy/oauth2": "dev-master"
}

2) AuthController.php

// src/Test/WebBundle/Controller/AuthController.php namespace Test\WebBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

// these import the "@Route" and "@Template" annotations
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

use OAuth2;


class AuthController extends Controller
{
    /**
     * @Route("/authorize", name="auth")
     */
    public function authAction(Request $request)
    {
        $authorizeClient = $this->container->get('test_web.authorize_client');

        if (!$request->query->get('code')) {
            return new RedirectResponse($authorizeClient->getAuthenticationUrl());
        }

        $authorizeClient->getAccessToken($request->query->get('code'));

        return new Response($authorizeClient->fetch('https://api.test.me/me'));
    }
}

3) OAuth2Client.php

// src/Test/WebBundle/Service/OAuth2Client.php
namespace Test\WebBundle\Service;

use OAuth2;

class OAuth2Client
{
    protected $client;
    protected $authEndpoint;
    protected $tokenEndpoint;
    protected $redirectUrl;
    protected $grant;
    protected $params;

    public function __construct(OAuth2\Client $client, $authEndpoint, $tokenEndpoint, $redirectUrl, $grant, $params)
    {
        $this->client = $client;
        $this->authEndpoint = $authEndpoint;
        $this->tokenEndpoint = $tokenEndpoint;
        $this->redirectUrl = $redirectUrl;
        $this->grant = $grant;
        $this->params = $params;
    }

    public function getAuthenticationUrl() {
        return $this->client->getAuthenticationUrl($this->authEndpoint, $this->redirectUrl);
    }

    public function getAccessToken($code = null)
    {
        if ($code !== null) {
            $this->params['code'] = $code;
        }

        $response = $this->client->getAccessToken($this->tokenEndpoint, $this->grant, $this->params);
        if(isset($response['result']) && isset($response['result']['access_token'])) {
            $accessToken = $response['result']['access_token'];
            $this->client->setAccessToken($accessToken);
            return $accessToken;
        }

        throw new OAuth2\Exception(sprintf('Unable to obtain Access Token. Response from the Server: %s ', var_export($response)));
    }

    public function fetch($url)
    {
        return $this->client->fetch($url);
    }
}

4) CredentialsCommand.php

// src/Test/WebBundle/Command/CredentialsCommand.php
namespace Test\WebBundle\Command;

use OAuth2;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CredentialsCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('oauth2:credentials')
            ->setDescription('Executes OAuth2 Credentials grant');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $credentialsClient = $this->getContainer()->get('test_web.credentials_client');
        $accessToken = $credentialsClient->getAccessToken();
        $output->writeln(sprintf('Obtained Access Token: <info>%s</info>', $accessToken));

        $url = 'http://oauth-server.local/api/articles';
        $output->writeln(sprintf('Requesting: <info>%s</info>', $url));
        $response = $credentialsClient->fetch($url);
        $output->writeln(sprintf('Response: <info>%s</info>', var_export($response, true)));
    }
}

5) Finally services.yml which is something wrong I think

parameters:
    adoy_oauth2.client.class: OAuth2\Client
    test_web.class: Test\WebBundle\Service\OAuth2Client

services:
    adoy_oauth2.client:
        class: %adoy_oauth2.client.class%
        arguments : [%oauth2_client_id%, %oauth2_client_secret%]
    test_web.credentials_client:
        class: %test_web.class%
        arguments : [%adoy_oauth2.client.class%, %oauth2_auth_endpoint%, %oauth2_token_endpoint%, %oauth2_redirect_url%, 'client_credentials', {client_id:%oauth2_client_id%},{client_secret:%oauth2_client_secret%}]
    test_web.authorize_client:
        class: %test_web.class%
        arguments : [adoy_oauth2.client, %oauth2_auth_endpoint%, %oauth2_token_endpoint%, %oauth2_redirect_url%, 'authorization_code', {redirect_uri:%oauth2_redirect_url%}]

The Error:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Test\WebBundle\Service\OAuth2Client::__construct() must be an instance of OAuth2\Client, string given, called in C:\wamp\www\myproj\app\cache\web_dev\appWeb_devDebugProjectContainer.php on line 1460 and defined in C:\wamp\www\myproj\src\Test\WebBundle\Service\OAuth2Client.php line 16

I am just out of idea now after trying a few times tweaking services.yml? Please help..

  • 写回答

1条回答 默认 最新

  • duan0821 2014-08-26 12:41
    关注

    At the moment Symfony2 does not have a way to specify a service id in service arguments using %parameter% syntax. In YAML config, you should use @service_id syntax for service arguments.

    评论

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类