2012-04-01 4 views
0

Ich versuche eine signierte Oauth 2.0 zu bekommen, die in Python funktioniert um eine Django App zu füttern. Hier ist die nächste, die ich bekam, mit diesem Code:Ich erhalte eine OAuth 2.0 API signierte Anfrage um in Python/Django zu arbeiten

from oauth_hook import OAuthHook 
import requests 
import json 

OAuthHook.consumer_key = "key" 
OAuthHook.consumer_secret = "secret" 
oauth_hook = OAuthHook("access_token", "", header_auth=True) 

client = requests.session(hooks={'pre_request': oauth_hook}) 
response = client.get('https://demo.checkfront.com/api/2/booking/form/') 
results = json.loads(response.content) 

print response.content 

Aber alles, was ich habe, ist dies:

{"error":"invalid_request","error_description":"Malformed auth header"} 

Betrachten von dem API-Provider, dass ich bekam:

  • Verbraucher Schlüssel
  • Verbrauchergeheimnis
  • Token-URL autorisieren
  • AccessToken URL
  • Zugriffstoken
  • Refresh Token

Der Prozess in PHP arbeitet, ist dies der Code

<?php 

include('../lib/CheckfrontAPI.php'); 

class Checkfront extends CheckfrontAPI { 

    public $tmp_file = '.checkfront_oauth'; 

    public function __construct($data) { 
     parent::__construct($data); 
     session_start(); 
    } 


    final protected function store($data=array()) { 
     $tmp_file = sys_get_temp_dir() . DIRECTORY_SEPARATOR. $this->tmp_file; 
     if(count($data) ) { 
      file_put_contents($tmp_file,json_encode($data,true)); 
     } elseif(is_file($tmp_file)) { 
      $data = json_decode(trim(file_get_contents($tmp_file)),true); 
     } 
     return $data; 
    } 

    public function session($session_id,$data=array()) { 
     $_SESSION['checkfront']['session_id'] = $session_id; 
    } 
} 


$Checkfront = new Checkfront(
    array(
     'host'=>'MY_ACCOUNT.checkfront.com', 
     'consumer_key' => 'consumer_key', 
     'consumer_secret' => 'consumer_secret', 
     'redirect_uri'=>'oob', 
     'refresh_token' => 'refresh_token', 
    ) 
); 


if($data = $Checkfront->cql('select * from status')) { 
    print_r($data); 

} elseif($Checkfront->error) { 
    // 
    print "Error: \n" . var_export($Checkfront->error,true); 
} 
?> 

und dies ist der CheckfrontAPI.php Code:

<?php 
/** 
* Checkfront SDK 
* PHP 5 
* 
* @package  CheckfrontAPI 
* @author  Checkfront <[email protected]> 
* @copyright 2008-2012 Checkfront Inc 
* @license  http://opensource.org/licenses/bsd-license.php New BSD License 
* @link  http://www.checkfront.com/developers/api/ 
* @link  https://github.com/Checkfront/PHP-SDK 
* 
* 
*/ 


/* 
* @access public 
* @package Checkfront 
*/ 
abstract class CheckfrontAPI { 

    protected $sdk_version = '1.1'; 
    protected $api_version = '2'; 

    public $error = array(); 
    private $api_timeout = '30'; 

    private $host = ""; 
    public $consumer_key = ""; 
    private $consumer_secret= ""; 
    private $access_token = ''; 
    private $refresh_token = ''; 

    private $server_token = ''; // legacy 

    private $api_id = 'UA'; 

    private $session_id = ''; 

    abstract protected function store($data); 
    abstract public function session($session_id,$data); 

    function __construct($config=array(),$session_id='') { 
     $this->host = $config['host']; 
     $this->consumer_key = $config['consumer_key']; 
     $this->consumer_secret = $config['consumer_secret']; 
     $this->redirect_uri = $config['redirect_uri']; 
     $this->oauth_url = "https://{$this->host}/oauth"; 
     $this->api_url = "https://{$this->host}/api/{$this->api_version}"; 
     $this->app_id = $config['app_id']; 
     $this->client_ip = $config['client_ip']; 
     $this->refresh_token = $config['refresh_token']; 
     $this->session_id = $session_id; 
     $this->account_id = $config['account_id']; 
     $this->server_token = $config['server_token']; 
     $this->tokens(); 
    } 

    /** 
    * Check and refresh access token if needed. 
    * 
    * @return bool 
    */ 
    private function init() { 
     if(isset($this->refresh_token)) { 
      if(!$this->access_token or $this->expire_token < time()) { 
       $this->refresh_token(); 
      } 
     } 
    } 


    /** 
    * API call via curl 
    * 
    * @param string $url 
    * @param array $data post/get data 
    * 
    * @return array json parsed response array 
    */ 
    final private function call($url,$data=array(),$type='') { 


     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_USERAGENT, "Checkfront PHP/SDK {$this->sdk_version} ({$this->app_id})"); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 

     // set custom headers 
     $headers = array('Accept: application/json'); 

     // legacy 
     if($this->server_token) { 
      $headers[] = "X-Server-Token: {$this->server_token}"; 
     } 

     if($this->client_ip) { 
      $headers[] = "X-Forwarded-For: {$this->client_ip}"; 
     } else { 
      $headers[] = "X-Forwarded-For: {$_SERVER['REMOTE_ADDR']}"; 
     } 

     if($this->account_id) { 
      $headers[] = "X-On-Behalf: {$this->account_id}"; 
     } 

     if($this->access_token) { 
      $headers[] = "Authorization: BEARER {$this->access_token}"; 
     } 

     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

     // pass session id 
     // @see session_create() 
     if($this->session_id) { 
      curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
      curl_setopt($ch, CURLOPT_COOKIE, "session_id={$this->session_id}"); 
     } 

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
     curl_setopt($ch, CURLOPT_TIMEOUT, $this->api_timeout); 

     if($data) { 
      curl_setopt($ch, CURLOPT_POST, true); 
      if(is_array($data)) { 
       // needs to encode to support assocative arrays 
       curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 
      } else { 
       curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
      } 
     } else { 
      curl_setopt($ch, CURLOPT_HTTPGET, true); 
     } 


     if($response = curl_exec($ch)) { 
      curl_close($ch); 
      $response = json_decode($response,true); 
      if($response['error']) { 
       $this->error = array('id'=>$response['error'],'msg'=>$response['error_description']); 
       return false; 
      } else { 
       return $response; 
      } 

     } else { 
      $this->error = array('curl'=>curl_error($ch)); 
     } 
    } 

    /** 
    * Set the session 
    * 
    * @param string session_id 
    * @param array $data session 
    * 
    * @return bool 
    */ 
    final public function set_session($session_id,$data=array()) { 
     $this->session_id = $session_id; 
     return $this->session($session_id,$data); 
    } 

    /** 
    * API request 
    * 
    * @param string $url 
    * @param array $data post/get data 
    * 
    * @return array json parsed response array 
    */ 
    final function api($path,$data=array()) { 

     $this->init(); 

     $url .= $this->api_url . '/' . $path; 
     if($response = $this->call($url,$data)) { 
      if($response['session_id']) { 
       $this->session($response['session_id']); 
      } 
      return $response; 
     } else { 
      return false; 
     } 
    } 


    /** 
    * Authorize request 
    * 
    * @param bool $redirect automatically send the redirect header 
    * 
    * @return mixed Returns if $redirect is true returns bool, otherwise returns the authorization URL 
    * @link http://www.checkfront.com/developers/api/#oauth 
    */ 
    final public function authorize($redirect=1) { 
     $args = array(
      'type'=>'web_server', 
      'client_id'=>$this->consumer_key, 
      'redirect_uri'=>$this->oauth_redirect_uri, 
      'response_type'=>'code', 
     ); 
     $url = $this->oauth_url . '/?' . http_build_query($args); 

     if($redirect) { 
      return header("Location: {$url}"); 
     } else { 
      return $url; 
     } 
    } 


    /** 
    * Fetch access token 
    * @param string $code returned from Checkfront::authorize() 
    * @return mixed 
    */ 
    final public function fetch_token($code) { 

     $data = array(
      'type'=>'web_server', 
      'client_id'=>$this->consumer_key, 
      'grant_type' => 'authorization_code', 
      'client_secret' => $this->consumer_secret, 
      'redirect_uri'=>$this->redirect_uri, 
      'code'=>$code, 
     ); 


     $url = $this->oauth_url . '/token/'; 
     if($tokens = $this->call($url,$data)) { 
      if($tokens['error']) { 
       return false; 
      } else { 
       $this->tokens($tokens); 
       return true; 
      } 
     } 
    } 

    /** 
    * Refresh access token 
    * @param string $code returned from Checkfront::authorize() 
    * @return mixed 
    */ 
    final private function refresh_token() { 

     $data = array(
      'type'=>'web_server', 
      'client_id'=>$this->consumer_key, 
      'grant_type' => 'refresh_token', 
      'client_secret' => $this->consumer_secret, 
      'redirect_uri'=>$this->redirect_uri, 
      'refresh_token'=>$this->refresh_token, 
     ); 

     $url = $this->oauth_url . '/token/'; 
     if($tokens = $this->call($url,$data)) { 

      if($tokens['error']) { 
       return false; 
      } else { 
       $this->tokens($tokens); 
       return true; 
      } 
     } 
    } 


    /** 
    * Get expire token datetime 
    * 
    * @param integer $time seconds to expore 
    * 
    * @return integer unix date - expire dirft. 
    */ 
    private function expire_token($time) { 
     return time() + $time - $this->expire_drift; 
    } 


    /** 
    * Set access token 
    * 
    * @param array $data Token data (access_token,refresh_token,expire_token) 
    * 
    * @return mixed 
    */ 
    private function tokens($data=array()) { 

     if($data) { 
      if($data['expires_in']) { 
       $data['expire_token'] = $this->expire_token($data['expire_in']); 
      } 
      $this->store(
       array(
        'refresh_token'=>$data['refresh_token'], 
        'access_token'=>$data['access_token'], 
        'expire_token'=>$data['expire_token'], 
        'updated'=>time() 
       ) 
      ); 
     } else { 
      $data = $this->store(); 
     } 

     if(isset($data['access_token'])) $this->access_token = $data['access_token']; 
     if(isset($data['refresh_token'])) $this->refresh_token = $data['refresh_token']; 
     if(isset($data['expire_token'])) $this->expire_token = $data['expire_token']; 
    } 


    /** 
    * CQL Query 
    * @param sting $q SQL style query 
    * @return mixed sql results, or false on failure 
    * @link http://www.checkfront.com/developers/api-cql/ 
    */ 
    final public function cql($q) { 
     $this->init(); 
     if($data = $this->get('cql',array('q'=>$q))) { 
      return $data; 
     } else { 
      return false; 
     } 
    } 


    /** 
    * API GET request 
    * 
    * @param string $url 
    * @param array $ags get data 
    * 
    * @return array json parsed response array 
    */ 
    final public function get($path, $data=array()) { 
     if($data) $path .= '/?' . http_build_query($data); 
     if($response = $this->api($path)) { 
      return $response; 
     } else { 
      return false; 
     } 
    } 


    /** 
    * API PUT request 
    * 
    * @param string $url 
    * @param array $ags put data 
    * 
    * @return array json parsed response array 
    */ 
    final public function put($path,$data) { 
     return $this->api($path,$data,'put'); 
    } 


    /** 
    * API DELETE request 
    * 
    * @param string $url 
    * 
    * @return array json parsed response array 
    */ 
    final public function delete($path,$data) { 
     return $this->api($path,$data,'delete'); 
    } 


    /** 
    * API POST 
    * 
    * @param string $path uri path 
    * @param array $data post data 
    * 
    * @return mixed 
    */ 
    final public function post($path,$data) { 
     return $this->api($path,$data); 
    } 


    public function session_clear() { 
     $this->session_id = 0; 
    } 
} 
?> 

Wie kann ich diese API-Aufrufe mit wit signiert bekommen h Oauth 2.0 unter Python/Django zu arbeiten?

Antwort

0

Die Checkfront-API ist OAuth2 und erfordert die Verwendung eines Bearer-Tokens gemäß OAuth2 (Revision 20).

Ich habe nicht mit der Django oauth Bibliothek gearbeitet, aber ich würde überprüfen, ob es OAuth2 unterstützt.

Hoffe, dass hilft.

0

Ich weiß, ich bin spät auf diese Party verrückt, aber ich habe gerade erst einen einfachen OAuth 2.0-Client (sanction) und ein Django-Frontend dafür (django-sanction). Ich gehe davon aus, dass es für das OP viel zu spät ist, aber vielleicht hilft es anderen, die über diese Frage stolpern.