Laravel Oauth2客户端使用Guzzle授权和重定向

时间:2015-04-04 02:03:10

标签: php laravel oauth-2.0 laravel-5 guzzle

我正在尝试使用Laravel和Guzzle的授权代码流来访问rest API。

他们指定要求:

GET https://api.restsite.com/oauth2/authorize ?
    client_id = [application id] &
    response_type = code &
    scope = orders inventory &
    redirect_uri = [redirect uri]

在Laravel中我实现了它:

// Create a client
$client = new Client();

    $request = $client->createRequest(
        'GET', 'https://api.restsite.com/oauth2/authorize',[
            'query' => [
                'client_id' => 'myclientid',
                'response_type' => 'code',
                'scope' => 'inventory',
                'redirect_uri' => 'https://myownsite/uri.php',
            ],
        ]
    );

    // Send the request
    $response = $client->send($request);

如果我print_r $ response,它将显示来自其网站的登录页面。

现在,他们的下一条指令是成功登录后,它会转到我的重定向uri:

https://[redirect uri]?code=[authorization code]

使用此授权码,我现在可以通过他们的指示再次拨打电话:

POST https://api.restsite.com/oauth2/token ?
     grant_type = authorization_code &
     code = [authorization code] &
     redirect_uri = [redirect uri]

最后如果一切顺利,JSON响应应如此:

{
  "access_token": [access token], 
  "token_type": "bearer", 
  "expires_in": 3600
}

我可以使用它来访问另一个端点上的受保护资源。

现在,我被困在Laravel中,在Guzzle第一次调用“授权”端点后,回复的$响应我不知道该怎么办,因为我没有自动重定向到任何地方

所以我暂时做的是添加了这个返回视图:

return View::make('welcome')->with('response', $response);

这是一个很好的花花公子(看起来丑陋没有css,因为实际上不是来自他们的网站)但是当我查看源代码时似乎有正确的表单代码。

当前网址只是我的项目根目录:

http://myserver:8080/test/public/

但是,在我尝试登录后,我被重定向到服务器的主根文件夹:

http://myserver:8080/

我不确定如何让它至少正确加载重定向URI,这样我就可以使用URI?code =参数并根据需要使用它来进行另一次调用。

我希望到目前为止我没有放过任何人。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我所做的不是使用Guzzle来处理来自外部网站的授权初始步骤,而是简单地执行其中一项:

控制器:

return redirect::to('https://api.restsite.com/oauth2/authorize?');

查看:

<a href="https://api.restsite.com/oauth2/authorize?">Approve App</a>

我将我的重定向uri / callback返回到我的应用程序然后使用Guzzle发布并检索必要的令牌,这些令牌作为json响应返回,因此不再需要任何外部站点/重定向。

最后,我可以使用实际的资源端点来查询数据。

<强>更新

根据要求,我提供了有关流程如何进展的更多细节:

查看(authtoken.blade.php):

<a href="https://api.restsite.com/oauth2/authorize?client_id=XXX&response_type=code&scope=inventory&redirect_uri=https://myownsite.com/return_uri.php&access_type=offline">Request New Token</a>

return_uri.php(http://myownsite.com/

<?php

ob_start();
$url = 'http://myserver:8080/test/public/authtoken/get';

date_default_timezone_set('America/Los_Angeles');

$authcode = $_GET['code'];

echo 'Authorization code: ' . $authcode;
sleep(15);

$servername = "xx.xxx.xxx.xx";
$username = "user";
$password = "pass";
$dbname = "ca";
$now = date("Y-m-d H:i:s");

if ($authcode) {

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    $sql = "INSERT INTO credentials (id, auth, authDate)
    VALUES ('1','$authcode', '$now') ON DUPLICATE KEY UPDATE auth = values(auth), authDate = values(authDate) ";

    if ($conn->query($sql) === TRUE) {
        echo "Auth code created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

    $conn->close(); 

    //echo '<br><br><a href="http://myserver:8080/test/public/authtoken/get">go back</a>';

    while (ob_get_status()) 
    {
        ob_end_clean();
    }       

    header( "Location: $url" );

}

?>

控制器

public function authtokenget()
{

    $creds = Credentials::find(1);
    $auth = $creds->auth;

    $client = new Client();

    $client->setDefaultOption('verify', false); 

    $data = 'grant_type=authorization_code&code=$auth&redirect_uri=https://myownsite.com/return_uri.php';
    $data_string = json_encode($data);   
    $datlen = strlen($data_string);

    $request = $client->createRequest(
        'POST', 'https://api.restsite.com/oauth2/token',[
            'headers' => [
                'content-type' => 'application/x-www-form-urlencoded',
                'content-length' => $datlen,
            ],
            'body' => $data_string,
            'auth' => ['xxxxx=', 'xxxxx'],
        ]
    );

    $response = $client->send($request);

}

<强> RECAP

  1. 使用View中的链接访问授权初始端点。
  2. 拥有一个php返回文件,该文件是获取必要的令牌/访问凭据并存储到数据库然后返回路径的请求的一部分。
  3. 该路径运行一个控制器功能,该功能现在可以抓取您之前保存的数据库条目中的数据,按照您的意愿进行操作。