PHP Conference Japan 2024

OAuthProvider::checkOAuthRequest

(PECL OAuth >= 1.0.0)

OAuthProvider::checkOAuthRequest檢查 OAuth 請求

說明

public OAuthProvider::checkOAuthRequest(字串 $uri = ?, 字串 $method = ?): void

檢查 OAuth 請求。

警告

此函式目前沒有說明文件;僅提供其參數列表。

參數

uri

可選的 URI 或端點。

method

HTTP 方法。可以選擇性地傳入其中一個 OAUTH_HTTP_METHOD_* OAuth 常數。

回傳值

無回傳值。

錯誤/例外

如果無法偵測 HTTP 方法,將發出 E_ERROR 等級的錯誤。

另請參閱

新增註解

使用者貢獻的註解 2 則註解

Lyuben Penkovski (l_penkovski at yahoo dot com)
14 年前
此函式會檢查 OAuth 請求是否有效且簽名正確。

$provider->checkOAuthRequest();

它首先呼叫 timestampNonceHandler 並期望從中得到 OAUHT_OK 的結果。如果結果不同,則會拋出例外。您需要自行編寫檢查時間戳記/隨機數組合的程式碼。

其次,它會呼叫 consumerHandler,並期望您的 consumerHandler 函式中的程式碼將 $provider->consumer_secret 設定為正確的值(您應該從儲存 consumer key 的 consumer 儲存位置取得它)。如果未設定 $provider->consumer_secret,或未設定正確的值,則會拋出例外。正確的值表示它應該與 consumer 在發送請求到這裡(provider)之前用於簽署請求的 consumer key 相同。同樣,此函式的預期結果是 OAUTH_OK 或一些 OAUTH 錯誤碼(如果您想拋出例外)。

第三,它會呼叫 tokenHandler,但僅限於當您請求 ACCESS token 或使用已授權的 ACCESS TOKEN 請求受保護的資料時。為了讓 provider 呼叫 tokenHandler,在呼叫 checkOAuthRequest 函式之前,provider 應該呼叫說明這不是請求 token 端點(這是 access token 端點)的方法

$provider->isRequestTokenEndpoint (false);
$provider->checkOAuthRequest();

同樣地,OAuthProvider 期望您在 tokenHandler 中的程式碼將 $provider->token_secret 設定為正確的值(您應該從 token 儲存位置取得它),因為在簽署過程中,它使用 CONSUMER SECRET(用於請求 token)以及 CONSUMER SECRET 和 TOKEN SECRET(用於 access token 和擷取受保護的資料)來簽署請求。

在呼叫這 3 個處理函式並返回良好結果 (OAUTH_OK) 並設定所需欄位 $provider->consumer_secret 和 $provider->token_secret 的值之後,checkOAuthRequest 函式會簽署請求。如果出現問題,它會拋出例外,否則您的程式碼將會繼續執行並處理請求

- 您可以建立請求 token(如果是第一次請求 token)
- 您可以建立 access token(如果是請求 access token)
- 您可以將受保護的資料返回給 consumer(如果是請求擷取受保護的資料)

這就是我程式碼中函式的樣子,但請記住,我才剛實作它,可能有些遺漏或忘記的地方,但總體而言,我認為這個想法應該很清楚

$this->dbModel 是用於與資料庫互動以及儲存/擷取 token 和 consumer 資料的物件

<?php

public function timestampNonceHandler ( $provider )
{
return
$this->dbModel->checkTimestampNonce ( $provider->consumer_key,
$provider->token,
$provider->timestamp,
$provider->nonce );
}

public function
consumerHandler ( $provider )
{
$consumer = $this->dbModel->getConsumerSecrets ($provider->consumer_key);

if(
$consumer['consumer_key'] != $provider->consumer_key)
{
return
OAUTH_CONSUMER_KEY_UNKNOWN;
}

if( (int)
$consumer['disabled'] != 0 )
{
return
OAUTH_CONSUMER_KEY_REFUSED;
}

$provider->consumer_id = $consumer['consumer_id']; # this is not required by OAuthProvider but I use it later in tokenHandler
$provider->consumer_secret = $consumer['consumer_secret']; # this is REQUIRED

return OAUTH_OK;
}

public function
tokenHandler ( $provider )
{
$token = $this->dbModel->getToken( $provider->token );

if(
time() > $token['expire'] )
{
return
OAUTH_TOKEN_EXPIRED;
}

if(
$token['consumer_id'] != $provider->consumer_id)
{
return
OAUTH_TOKEN_REJECTED;
}

if( (int)
$token['authorized'] == 0 )
{
return
OAUTH_TOKEN_REJECTED;
}

if(
$token['token_type'] != 'access')
{
if(
$token['verifier'] != $provider->verifier)
return
OAUTH_VERIFIER_INVALID;
}

$provider->token_id = $token['token_id']; # not required to be set by OAuthProvider
$provider->token_secret = $token['token_secret']; # this is REQUIRED

return OAUTH_OK;
}

?>
tim at timlytle dot net
11 年前
這個方法似乎每個實例只能呼叫一次(或者重複呼叫時,結果與第一次呼叫相同)。

我的使用案例是可由使用者或透過雙向驗證存取的 API 端點。如果一般的 OAuth 驗證失敗,我會呼叫 is2LeggedEndpoint(true) 並再次執行。

要讓它正常運作,需要重新建立 OAuth 提供者,僅更改其中一個旗標似乎對下一次呼叫沒有影響。
To Top