4

我使用 @J7mbo 的精彩 Twitter API PHP Wrapper 脚本在 PHP 中构建了一个名为TwoolsTwitter应用程序。像许多 Twitter 应用程序示例一样,它要求您在dev.twitter.com创建一个应用程序,获取 OAUTH 密钥(消费者密钥、消费者密钥、访问令牌和访问令牌密钥)并将它们添加到应用程序中。

我对它的工作方式感到满意,但我对这种工作方式与允许用户登录以使用应用程序的应用程序之间的区别感到困惑。

我的 Twitter 应用程序存储了 OAUTH 令牌,并且可以在没有用户指示的情况下随时运行。它可以按计划运行,例如每小时运行一次。问题是它需要用户在 dev.twitter.com 上创建一个帐户并获取这些令牌。

其他应用似乎允许用户授权它使用他们的详细信息。在这种情况下,用户不必创建自己的应用程序 - OAUTH 详细信息可能由应用程序存储。这种技术叫什么?我似乎无法找出这两种技术之间的区别。在后一种情况下,一旦应用程序获得授权,它是否可以在没有用户指示的情况下自主行动?例如,它可以按计划运行吗?

我希望你能扭转我的困惑!

谢谢。

4

3 回答 3

2

您已经询问了三种身份验证方法;这是我目前的理解:

仅限应用程序:正是它所说的。您的应用程序被分配了一组访问令牌(除了将使用的消费者令牌,无论身份验证类型如何)。请求被视为来自您的应用程序,而不是来自用户。

使用仅应用程序身份验证发出请求时,没有“当前用户”的概念。因此,诸如 POST statuses/update 之类的端点将无法与仅应用程序身份验证一起使用。

单用户这是当您的整个应用程序总共只有一个用户时。这是一个非常小众的案例,可能类似于单用户管理应用程序。如果您查看示例,则标记都是硬编码的。您当前正在做的事情听起来很相似,只是您基本上是在向用户询问值并将其传入。正如您所指出的,这并不理想。实际上,该页面上的第一件事是仅应用程序通常更合适。

使用 Twitter 登录 在此过程中有几个步骤,但从用户的角度来看,他们会被重定向到 twitter 并同意代表他们授予您的应用程序权限。然后,您可以存储返回令牌并发出请求。

我很确定 SIWT 就是您要找的。它可以按计划运行吗?我不明白为什么不...除非您取回的令牌在一段时间后过期。它也可能不被认为是最佳实践,但我找不到任何说不这样做的东西。

我目前正在自己​​实现这个(用作快速而肮脏的登录方法),这是该过程第一阶段的代码。该代码非常丑陋但有效..您应该取回最初的 oauth 令牌。在处理不正确的服务器时间(这真的会把你搞砸)时,我把头撞在墙上好几天了,并在@J7mbo 包装器上分享了你的困惑。

$oauthStuffs = array(
'oauth_consumer_key' => "**YOUR_CONSUMER_KEY**",
'oauth_nonce' => base64_encode(openssl_random_pseudo_bytes(32)),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_version' => '1.0',
'oauth_callback' => '**YOUR_CALLBACK_URL**'
);

ksort($oauthStuffs);

$method = 'POST';

$baseUrl = 'https://api.twitter.com/oauth/request_token';

$outputString = '';

$i = 0;
foreach($oauthStuffs as $key => $value){
    $outputString.= rawurlencode($key).'='.rawurlencode($value);
    $i++;

    if($i < count($oauthStuffs)) $outputString .='&';
}


$baseString = $method.'&'.rawurlencode($baseUrl).'&'.rawurlencode($outputString);

$consumerSecret = "**YOUR_CONSUMER_SECRET**";

$signingKey = rawurlencode($consumerSecret).'&';

$signature = base64_encode(hash_hmac('sha1', $baseString , $signingKey, true));

$oauthStuffs['oauth_signature']=$signature;

ksort($oauthStuffs);

$headerString = "Authorization: OAuth ";
$i = 0;
foreach($oauthStuffs as $key => $value){
    $headerString .= rawurlencode($key).'="'.rawurlencode($value).'"';
    $i++;
    if($i < count($oauthStuffs)) $headerString .= ", ";
}


$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $baseUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($headerString));

$postFields = array(
    'oauth_callback' => rawurlencode('**YOUR_CALLBACK_URL**')
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);


$response = curl_exec($ch);
echo $response;

如果我完成了这个并且我没有了解到另一个支持 SIWT 的库,我可能会将它扔到 github 上。

如果这些都不适合您,也许还可以查看以下身份验证方法的比较:https ://dev.twitter.com/docs/auth/obtaining-access-tokens

[更新:我自己实现了整个事情并让它工作,但我建议查看其他一些库,例如abraham/twitteroauth ]

于 2013-11-05T15:37:44.547 回答
1

这是我在墙上撞了好几天的问题。但最后我明白了。

  1. 推特消费者代币
  2. 推特消费秘密
  3. 用户代币
  4. 用户秘密令牌

这些是我们需要代表用户发布推文的内容,在此,TWITTER CONSUMER TOKEN应该TWITTER CONSUMER SECRET由推特应用程序的管理员创建,该应用程序需要代表用户发布推文的权限。和是您需要用户代表他发布推文的东西USER TOKENUSER SECRET TOKEN您可以通过使用getRequestToken()OAUTH 的功能来获得它。要了解如何使用此功能,请在此处redirect.php签入twitteroauth由 Abraham 编写的。获得后,您可以使用您的 TWITTER CONSUMER TOKEN 和 TWITTER CONSUMER SECRET 以及从 api 收到的用户的用户令牌和用户秘密令牌代表他/她发布。就是这样!USER TOKENUSER SECRET TOKEN

但用户可以随时通过访问撤销访问权限,

https://twitter.com/settings/applications并单击您的应用旁边的“撤销访问”按钮。

于 2014-01-07T15:31:08.933 回答
0

看看这个,也许这就是你想要的

https://dev.twitter.com/docs/ios/using-reverse-auth

https://dev.twitter.com/docs/faq#6536

对不起,我的英语不好

于 2013-10-31T15:54:51.063 回答