0

我为一组数据提供了一个开发者 API,我想添加 2-legged oauth 身份验证,以便我可以对开发者应用程序进行身份验证以使用该 api。首先,对于这种类型的身份验证,这是最好的解决方案吗?

其次,从实现/流程的角度来看,我的理解是否正确:

  1. 一个随机的开发者,去我的网站并使用一个“注册”页面,当我提交给他们一个 api keysecret时,我可以以任何我希望的方式生成。

  2. 然后,他们使用 oauth 库(如此处找到的 php 库使用这些凭据对他们的请求进行签名。

    $consumer = new OAuthConsumer('thegeneratedkey', 'thegeneratedsecret');

$sig_method = 新 OAuthSignatureMethod_HMAC_SHA1;

//use oauth lib to sign request
$req = OAuthRequest::from_consumer_and_token($consumer, null, "GET", 'http://mydonaim/api/', array('someapimethod', 'somevalue'));
$sig_method = new OAuthSignatureMethod_HMAC_SHA1();
$req->sign_request($sig_method, $consumer, null);//note: double entry of token
  1. 然后,我的服务器使用 oauth 库来检查该请求的“签名”以验证开发人员应用程序。

$secret = '秘密'; // 忽略这一行。

$secret = 'secret'; // Use the $_GET['oauth_consumer_key'] to find the secret in my system.
$consumer = new OAuthConsumer($_GET['oauth_consumer_key'], $secret);
$sig_method = new OAuthSignatureMethod_HMAC_SHA1;

$method = $_SERVER['REQUEST_METHOD'];
$uri = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$sig = $_GET['oauth_signature'];    
$req = new OAuthRequest($method, $uri);

//token is null because we're doing 2-leg
$valid = $sig_method->check_signature( $req, $consumer, null, $sig );

这个对吗?

如果是这样,每次发出请求时都必须进行此身份验证,还是我可以生成某种令牌以减少从开发人员应用程序到我的 api 的每个 HTTP 请求的权重?

4

1 回答 1

1

首先,对于这种类型的身份验证,这是最好的解决方案吗?

OAuth 旨在允许应用程序在不知道用户凭据的情况下从第三方服务获取用户数据。只要这是您需要做的,那么 OAuth 就是适合您的解决方案。

如果是这样,每次发出请求时都必须进行此身份验证,还是我可以生成某种令牌以减少从开发人员应用程序到我的 api 的每个 HTTP 请求的权重?

每一个 API 请求都必须提供两组令牌/秘密,并将其传递到您的 OAuth 库以进行身份​​验证。这就是 OAuth 的工作原理。您不应该在流程中添加另一个令牌,因为这只会使事情变得更加复杂,并且会使任何最终获得 OAuth 的可怜的开发人员感到困惑。

请记住,密钥集的存在使可以撤销对整个应用程序的访问权限,因此用户也可以这样做,前提是您为他们提供了这样做的接口。两个集合都包含在每个请求中,因此您的应用程序可以检查它们的有效性。

不要担心 HTTP 请求的“重量”,除非您已经执行了基准测试和分析并确定请求的大小是您需要处理的事情。我几乎可以保证这不是问题。

于 2011-03-13T16:03:30.200 回答