2015-02-11 3 views
0

Я пытаюсь учиться и играть с реализацией PHP OAuth, как определено here. Я не использую какую-либо библиотеку, просто чистую реализацию OAuth, поскольку я пытаюсь ее изучить. Однако, как я обычно пытаюсь это сделать, я не могу заставить подписи соответствовать.PHP OAuth Signature Mismatch

На стороне потребителя у меня есть:

<?php 
$consumer_key = '1234'; 
$consumer_secret = '1234'; 
$url = 'http://localhost/oauth/provider/request'; 

try { 
    $oauth = new OAuth($consumer_key, $consumer_secret); 
    $signature = $oauth->generateSignature('POST', $url); 
    $request_token = $oauth->getRequestToken($url); 
    var_dump($signature); 
    print_r($request_token); 
} catch (OAuthException $E) { 
    var_dump($E); 
} 

На стороне провайдера у меня есть:

<?php 

function call(){ 
    return OAUTH_OK; 
} 

$OAuthProvider = NULL; 

try{ 
    $OAuthProvider = new OAuthProvider(); 
    $OAuthProvider->consumerHandler('call'); 
    $OAuthProvider->timestampNonceHandler('call'); 
    $OAuthProvider->tokenHandler('call'); 
    $OAuthProvider->isRequestTokenEndpoint(true); 
    $OAuthProvider->checkOAuthRequest(); 
} 
catch(Exception $ex){ 
    echo $OAuthProvider->signature; 
} 

Довольно простое право? Тогда сообщение об ошибке из пойманного исключения, которое я получаю, это «Signatures_do_not_match». Я проверил, и действительно, подписи не совпадают. Вот пример выхода:

Consumer: 8cePFQFqJbL3hY6OjZe6kw63irc= 
Provider: 2SPGA0GcC7GLLR1Jte53xz_bWOY 

Любые идеи?

ответ

0

Глупо мне, я не читал спецификацию функций обратного вызова должным образом. Реализация, которая работает в:

Потребитель:

<?php 

$consumer_key = '1234'; 
$consumer_secret = '1234'; 
$url = 'http://localhost/oauth/provider/request'; 

try { 
    $oauth = new OAuth($consumer_key, $consumer_secret); 
    $signature = $oauth->generateSignature('POST', $url); 
    $request_token = $oauth->getRequestToken($url); 
} catch (Exception $ex) { 
    var_dump($ex); 
} 

И провайдер:

<?php 
$OAuthProvider = NULL; 

function consumerHandler(){ 
    return OAUTH_OK; 
} 

function timestampNonceHandler(){ 
    global $OAuthProvider; 
    /** 
    * Here is supposed to be a function to check if 
    * the consumer secret is legit, and is then used to check if the signatures match. 
    */ 
    $OAuthProvider->consumer_secret = '1234'; 
    return OAUTH_OK; 
} 

try{ 
    $OAuthProvider = new OAuthProvider(); 
    $OAuthProvider->consumerHandler('consumerHandler'); 
    $OAuthProvider->timestampNonceHandler('timestampNonceHandler'); 
    $OAuthProvider->isRequestTokenEndpoint(true); 
    $OAuthProvider->checkOAuthRequest(); 
} 
catch(Exception $ex){ 
    var_dump($ex); 
} 

Надеется, что это помогает кто-то хочет узнать о OAuth, как я сделал.