我正在使用https://github.com/abraham/twitteroauth库。我已经在Twitter上创建了我的应用程序,回调工作正常(甚至在本地主机上),但有一件事让我烦恼的是自动登录是如何发生的?我知道存在于MYSQL数据库中的“user_id”以及oauth_token和oauth_token_secret,但是如何在用户进入站点时立即获取user_id,因此我可以查询数据库以查看它是否已存在且不存在,无需一次又一次地弹出授权twitter弹出窗口然后到达回调?
我见过很多像这样的问题,但没有人以令人满意的方式回答过这个问题。
答案 0 :(得分:0)
应该保存以用于自动验证用户的那些是oauth_access_token和oauth_access_secrete。你有没有设法从Twitter获得它们? Oauth steos是:
获取请求令牌 将用户发送给授权 交换访问令牌的请求令牌 使用桌面和带外的带外/ PIN码模式移动应用程序
答案 1 :(得分:0)
实际上,它需要是PHP自己的$_SESSION
和OAuth回调的混合体。回调后,设置您在数据库中插入的当前用户ID,或者从Twitter OAuth响应中查询“user_id”(您应该将其与用户名一起存储在数据库中),然后将其用于将来的参考,并使用{ {1}}包含您自己数据库中的注册用户数据。
所以,快速举例
$_SESSION
所以基本上,如果没有他点击LOGIN WITH TWITTER按钮,就无法完成AUTO LOGIN(就像用户已登录到twitter,并且已经注册到您的网站),除非您设置{{1的生命周期非常高(例如,就像twitpic一样)。
function action_login()
{
if ( ! $this->user->is_logged())
{
// Create TwitterOAuth object with our Twitter provided keys
$tOAuth = new TwitterOAuth($this->config->get('consumer_key'), $this->config->get('consumer_secret'));
// Generate request tokens
$requestToken = $tOAuth->getRequestToken(url::site('auth/twitter','http'));
$_SESSION["oauth_token"] = $requestToken["oauth_token"];
$_SESSION["oauth_token_secret"] = $requestToken["oauth_token_secret"];
// Display Twitter log in button with encoded link
$this->view->set('url', $tOAuth->getAuthorizeURL($requestToken["oauth_token"]));
$_SESSION['current_url'] = Request::detect_uri();
}
echo $this->view->render();
}
public function action_twitter()
{
if ( empty($_GET["denied"]) && isset($_GET["oauth_token"]))
{
if ($_GET["oauth_token"] == @$_SESSION["oauth_token"])
{
// Use generated request tokens (from session) to construct object
$tOAuth = new TwitterOAuth($this->config->get('consumer_key'), $this->config->get('consumer_secret'), $_SESSION["oauth_token"], $_SESSION["oauth_token_secret"]);
// Retrieve access token from Twitter
$accessToken = $tOAuth->getAccessToken();
// Check we have valid response
if(is_numeric($accessToken["user_id"])) {
// Remove request token session variables
if ($this->user->loaded() || $this->user->where('user_id', '=', $accessToken['user_id'])->find()->loaded())
{
$this->user->values(array(
'oauth_token' => $accessToken['oauth_token'],
'oauth_token_secret' => $accessToken['oauth_token_secret'],
'screen_name' => $accessToken['screen_name'],
))->update();
}
else
{
$this->user->values(array(
'user_id' => $accessToken['user_id'],
'oauth_token' => $accessToken['oauth_token'],
'oauth_token_secret' => $accessToken['oauth_token_secret'],
'screen_name' => $accessToken['screen_name'],
))->create();
}
unset($_SESSION["oauth_token"]);
unset($_SESSION["oauth_token_secret"]);
echo $this->view->render();
// Redirect to main page
}
}
}
$this->request->redirect($_SESSION['current_url']);
}
正在检查$_SESSION
(MYSQL上的自动增量)和来自Twitter信息的$this->user->is_logged()
编辑:此外,最快捷,最干净的方法是使用Javascript SDK在页面加载时使用Twitter凭据进行AJAX调用,然后使用SDK提供的信息设置$_SESSION['id']
变量