PHP Conference Japan 2024

OAuthProvider::checkOAuthRequest

(PECL OAuth >= 1.0.0)

OAuthProvider::checkOAuthRequest检查OAuth请求

描述

public OAuthProvider::checkOAuthRequest(string $uri = ?, string $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。如果结果不同,则抛出异常。检查时间戳/nonce组合的代码由您编写。

其次,它调用consumerHandler,并期望您在consumerHandler函数中的代码将$provider->consumer_secret设置为正确的值(您应该从其与消费者密钥一起保存的消费者存储位置获取它)。如果$provider->consumer_secret未设置,或未设置为正确的值,则会抛出异常。正确的值意味着它应该与消费者在发送到此处(提供者)之前用于签署请求的消费者密钥相同。同样,此函数的预期结果是OAUTH_OK,或者如果您想抛出异常,则为某些OAUTH错误代码。

第三,它调用tokenHandler,但仅当您请求访问令牌或使用授权的访问令牌请求受保护的数据时才调用。为了让提供者调用tokenHandler,在调用checkOAuthRequest函数之前,提供者应调用该方法,表明这不是请求令牌端点(这是访问令牌端点)

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

同样在这里,OAuthProvider期望您在tokenHandler中的代码将$provider->token_secret设置为正确的值(您应该从您的令牌存储位置获取它),因为在签名过程中它使用消费者密钥(对于请求令牌)和消费者密钥以及令牌密钥(对于访问令牌和受保护数据的获取)来签名请求。

在调用这三个处理程序函数并返回良好结果(OAUTH_OK)并设置所需字段$provider->consumer_secret和$provider->token_secret的值后,checkOAuthRequest函数将对请求进行签名。如果出现问题,它将抛出异常,否则您的代码将继续处理请求。

-您可以创建请求令牌(如果这是对请求令牌的第一次请求)
-您可以创建访问令牌(如果这是对访问令牌的请求)
-您可以将受保护的数据返回给消费者(如果这是获取受保护数据的请求)

这就是我的代码中函数的样子,但是请记住,我只是实现了它,我可能错过或忘记了一些东西,但总的来说,我认为这个想法应该很清楚。

$this->dbModel是用于处理数据库以及保存/检索令牌和消费者数据的对象。

<?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']; # 这不是OAuthProvider必需的,但我稍后在tokenHandler中使用它
$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']; # 不是OAuthProvider必需设置的
$provider->token_secret = $token['token_secret']; # 这是必需的

return OAUTH_OK;
}

?>
tim at timlytle dot net
11年前
此方法似乎每个实例只能调用一次(或者重复调用时与第一次调用结果相同)。

我的用例是用户或使用双腿身份验证可以访问的API端点。如果正常的OAuth失败,我会调用is2LeggedEndpoint(true)并再次运行。

要使该功能正常工作,需要重新创建 OAuth 提供程序,仅更改其中一个标志似乎对下一次调用无效。
To Top