我用@J7mbo的精彩Twitter API PHP Wrapper脚本在PHP中构建了一个名为Twools的Twitter应用程序。与许多 Twitter 应用示例一样,它要求您在 dev.twitter.com 创建一个应用,获取 OAUTH 密钥(使用者密钥、使用者机密、访问令牌和访问令牌机密)并将其添加到应用中。
我对它的工作方式感到满意,但我对这种工作方式与允许用户登录以使用该应用程序的应用程序之间的区别感到困惑。
我的 Twitter 应用存储 OAUTH 令牌,可以在没有用户指示的情况下随时运行。它可以按计划运行,例如每小时运行一次。问题是它要求用户在 dev.twitter.com 创建一个帐户并获取这些令牌。
其他应用程序似乎允许用户授权它使用他们的详细信息。在这种情况下,用户不必创建自己的应用程序 - OAUTH 详细信息可能由应用程序存储。这种技术叫什么?我似乎无法找出这两种技术之间的区别。在后一种情况下,一旦应用程序获得授权,它是否可以在没有用户指示的情况下自主操作?例如,它可以按计划运行吗?
希望你能扭转我的困惑!
谢谢。
您已经询问了三种身份验证方法;以下是我目前的理解:
仅限应用程序:正是它所说的。为应用程序分配了一组访问令牌(除了将要使用的使用者令牌之外,无论身份验证类型如何)。请求被视为来自你的应用,而不是来自用户。
使用仅应用程序身份验证发出请求时,没有"当前用户"的概念。因此,诸如 POST 状态/更新之类的端点将无法使用仅应用程序身份验证。
单用户 这是当您的整个应用总共只有一个用户时。这是一个非常小众的案例,也许类似于单个用户管理应用程序。如果您查看示例,就会发现令牌都是硬编码的。您当前正在做的事情听起来很相似,除了您基本上是要求用户输入值并将其传入。正如你所指出的,这并不理想。事实上,该页面上的第一件事是说仅应用程序通常更合适。
使用 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]
来一直把头撞在墙上的问题。但最后我明白了。
- 推特消费者令牌
- 推特消费者秘密
- 用户令牌
- 用户密钥令牌
这些是我们代表用户发布推文所需的内容,在这种情况下,TWITTER CONSUMER TOKEN
和TWITTER CONSUMER SECRET
应由Twitter应用程序的管理员创建,该管理员/需要代表用户发布权限。USER TOKEN
和USER SECRET TOKEN
是用户代表他发布推文所需的内容。您可以使用 OAUTH 的getRequestToken()
函数来获取此内容。要了解如何使用此功能,请查看亚伯拉罕在此处编写的twitteroauth
redirect.php
。获得USER TOKEN
和USER SECRET TOKEN
后,您可以使用您的 TWITTER 消费者令牌和 TWITTER 消费者密钥以及从 API 接收的用户令牌和用户密钥令牌代表他/她发布。就是这样!
但是用户可以随时通过访问来撤销访问权限,
https://twitter.com/settings/applications 然后单击应用程序旁边的"撤销访问权限"按钮。
看看这个,也许这就是你想要的
https://dev.twitter.com/docs/ios/using-reverse-auth
https://dev.twitter.com/docs/faq#6536
对不起,我的英语不好