如何在用户允许访问后将Box的“代码”转换为“令牌”

时间:2013-01-04 04:11:05

标签: php authentication oauth-2.0 access-token box-api

我是新手,试图连接Box的API v2。我成功地建立了一个PHP客户端库,感谢developer.box.com/auth第一段中的链接。我已经完整阅读了Box的演练超过两次以及大约100,000个问题并在这里回答了这个问题。用户重定向到Box的授权页面,输入其凭据并单击“允许”后,我的问题就出现了。结果根据我的redirect_uri和登录页面的url而有所不同,我将我的client_id和client_secret放在一起:1)如果我的redirect_uri与我的https://mysite.com/login_with_box匹配,那么用户显然会重定向到同一个网址,将用户发送回Box的授权页面; 2)如果我的redirect_uri与https://mysite.com/login_with_box页面不同,则用户成功返回我的redirect_uri,其url包含30秒的代码。我知道我已经接近搞清楚这一点,但不知道如何在30秒或更短的时间内将代码转换成代码并使用它来显示用户的文件夹,文件,信息或其他任何内容。非常感谢您的考虑。这就是我的立场:

// mysite.com/client.php:

// ...

case 'Box':
    $this->oauth_version = '2.0';
    $this->request_token_url = '';
    $this->dialog_url = 'https://api.box.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&state={STATE}';

    $this->append_state_to_redirect_uri = '';
    $this->access_token_url = 'https://api.box.com/oauth2/token';
    $this->authorization_header = true;
    $this->url_parameters = false;
break;

// ...

// mysite.com/login_with_box.php:

// ...

$client->client_id = '[my_client_id]';
$client->client_secret = '[my_client_secret]';

if(($success = $client->Initialize())) {
    if(($success = $client->Process())) {
        if(strlen($client->access_token)) {
            $success = $client->CallAPI(
                'https://api.box.com/2.0/users/me', 
                'GET', array(), array('FailOnAccessError'=>true), $user);
        }
    }
    $success = $client->Finalize($success);
}

// ...

2 个答案:

答案 0 :(得分:1)

您似乎需要将重定向网址与最初通过OAuth流程向用户发送的网址不同。

例如,您可以让https://mysite.com/login_with_box通过OAuth流程向用户发送邮件,https://mysite.com/receive_box_oauth_response是在身份验证过程之后重定向到的网址,并从框中处理OAuth响应。

答案 1 :(得分:1)

我明白了。问题当然完全是我的错。以下是我如何将Box API v2与Box推荐的PHP OAuth库连接起来:

  1. 在developers.box.com上创建一个应用,并将所需的redirect_uri设置为https://mysite.com/oauth/login_with_box.php

  2. www.phpclasses.org/package/7700-PHP-Authorize-and-access-APIs-using-OAuth.html

  3. 下载PHP OAuth库
  4. 在PHP OAuth库的oauth_client.php中添加如下例所示的内容。

    case 'Box':
        $this->oauth_version = '2.0';
        $this->request_token_url = '';
        $this->dialog_url = 'https://api.box.com/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&state={STATE}';
        $this->append_state_to_redirect_uri = '';
        $this->access_token_url = 'https://api.box.com/oauth2/token';
        $this->authorization_header = true;
        $this->url_parameters = false;
    break;
    
  5. 创建类似login_with_box.php的内容并将其添加到PHP OAuth库中。我的login_with_box.php内容如下。

    <?php  
    
    require('http.php');
    
    require('oauth_client.php');
    
    $client = new oauth_client_class;
    
    $client->server = 'Box';
    
    $client->redirect_uri = 'https://mysite.com/oauth/login_with_box.php';
    
    $client->client_id = 'xxxxxx_BOX_API_CLIENT_ID_xxxxxx';
    
    $client->client_secret = 'xxxxxx_BOX_API_CLIENT_SECRET_xxxxxx';
    
    if(strlen($client->client_id) == 0 || strlen($client->client_secret) == 0)
      die('You need an app to do that.');
    
    if(($success = $client->Initialize())) {
    
        if(($success = $client->Process())) {
    
            if(strlen($client->access_token)) {
    
            $success = $client->CallAPI(
    
                'https://api.box.com/2.0/folders/0',
    
                'GET', array('format'=>'json'), array('FailOnAccessError'=>true), $folder);
    
            }
    
        }
    
        $success = $client->Finalize($success);
    
    }
    
    if($client->exit)
    
        exit;
    
    if($success) { 
    
    ?>
    
    <!doctype html>
    <html>
    <head>
    <title>Box OAuth client results</title>
    </head>
    <body>
    <?php echo '<h1>You successfully logged in with Box</h1>'; echo '<pre>', HtmlSpecialChars(print_r($folder, 1)), '</pre>'; ?>
    
    </body>
    </html>
    
    <?php } else { ?>
    
    <!doctype html>
    <html>
    <head>
    <title>OAuth client error</title>
    </head>
    <body>
    <h1>OAuth client error</h1>
    <pre>Error: <?php echo HtmlSpecialChars($client->error); ?></pre>
    </body>
    </html>
    
    <?php } ?>
    
  6. 我希望这有助于某人。