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)
13 年前
此函数检查 OAuth 请求是否有效且签名正确。

$provider->checkOAuthRequest();

它首先调用 timestampNonceHandler 并期望它返回结果 OAUHT_OK。如果结果不同,则会抛出异常。检查时间戳/随机数组合的代码由您编写。

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

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

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

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

在这些 3 个处理程序函数被调用并返回良好结果(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
10 年前
似乎此方法只能对每个实例调用一次(或在重复调用时给出与第一次调用相同的结果)。

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

要使它正常工作,OAuth 提供者需要重新创建,仅仅更改一个标志似乎对下次调用没有影响。
To Top