您已经询问了三种身份验证方法;这是我目前的理解:
仅限应用程序:正是它所说的。您的应用程序被分配了一组访问令牌(除了将使用的消费者令牌,无论身份验证类型如何)。请求被视为来自您的应用程序,而不是来自用户。
使用仅应用程序身份验证发出请求时,没有“当前用户”的概念。因此,诸如 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 ]