此函式會檢查 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']; $provider->consumer_secret = $consumer['consumer_secret']; 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']; $provider->token_secret = $token['token_secret']; return OAUTH_OK;
}
?>