2011-10-16 76 views
1

我在请求标题中设置了oauth_callback URL,当我在Twitter中这样做时,它工作正常,用户被重定向到回调URL。但是使用Tumblr的API,回调URL被忽略,用户被重定向到默认的URL。有没有人经历过这个?除了我应该设置的标题外,还有别的地方吗?我尝试将它作为参数传递,但那也没有效果。Tumblr OAuth回调URL

任何帮助,将不胜感激。

回答

1

如果您尝试在回调网址中嵌入用户标识,那么这篇文章可以帮助您。
您可以将oauth标记保存在会话中,稍后在回调中可以从会话中检索用户。

令牌要求:

def ask_access 
    tumblr_consumer = get_consumer 
    if tumblr_consumer 
    #1. get a request token 
    request_token = tumblr_consumer.get_request_token 
    session[:request_token] = request_token 
    session[:user_token] = "#{request_token.params[:oauth_token]}_#{current_user.id}" 
    #2. have the user authorize 
    redirect_to request_token.authorize_url 
    else 
    render :text=> "Failed to acquire request token from Tumblr." 
    end 
end 

的回调:

def call_back 
    if params[:oauth_token] && params[:oauth_verifier] 
    request_token = session[:request_token] 
    user_id = session[:user_token].split("_")[1] 
    user = UserProfile.find user_id 
    ##3. get an access token 
    access_token = request_token.get_access_token({:oauth_verifier => params[:oauth_verifier]}) 
    user.tumblr_token = access_token.params[:oauth_token] 
    user.tumblr_secret = access_token.params[:oauth_token_secret] 
    user.save! 
    end 
end 
+0

谢谢,因为Tumblr不允许请求头中的回调url,所以这是唯一的解决方案。对不起,很晚才接受:) – Rush

2

Tumblr为此做了这些(我假设)。他们要求在应用程序注册时定义回调URL,并且在实现过程中不会让它重写。

安全问题是确保没有人可以窃取您的应用程序令牌并尝试使用它来使用您的声誉来访问客户的数据。通过强制所有回调转到默认URL,他们可以保证只有您的应用程序能够获得访问令牌。

的两种方式来处理这个问题是:

1)有做基于Cookie或其他一些数据 2)重定向到你想要去的,已针对不同的回调网址,不同的应用令牌的默认网址。

5

根据Tumblr's developer blog,这是的tumblr的API中的错误,并已得到修复。

你们中许多人已经感到沮丧,你不能覆盖 回调URL当用户试图将授权其 应用。好消息:我们修补了造成这个问题的错误。

现在,您可以传递一个带有oauth_callback参数的url,一旦完成,我们将 重定向到该端点。

让我们来看一个简单的例子。

当用户呈现画面授权您的应用程序,你 应该能够在URL中 oauth_callback参数替代默认的回调。

http://www.tumblr.com/oauth/authorize?oauth_token=your_token&oauth_callback=http%3A%2F%2Fmysite.com/oauth_callback/testing 上面的网址将用户重定向到 mysite.com/oauth_callback/testing,让你知道,如果用户有 批准或拒绝您的应用程序。

更新2013年3月14日

从今天开始,的tumblr不再尊重oauth_callback参数。我之前链接到的博客文章已被删除。我最终使用了接受的答案的变体来解决它。

+0

你是如何设法解决它的? – Jhn

-1

Tumblr实现了与Twitter不同的这种行为,因此Ruby OAuth库的相同用法会产生不同的结果。

为了您@callback_url的价值,这个作品在Twitter上:

@request_token = @oauth.get_request_token({ 
    oauth_callback:@callback_url 
    }) 
    redirect_to @request_token.authorize_url 

但对于的tumblr,你将被重定向到您的默认网址。要指定一个不同的URL,你应该这样做:

@request_token = @oauth.get_request_token 
redirect_to @request_token.authorize_url + '&' + { oauth_callback:@callback_url }.to_query 

这是他们的文档/博客文章(在另一个答案引用)是一致的。根据OAuth 1.0a规范,我没有检查过它是否“正确”。

2

我无法回应Jonathan Tran的回答,因为我的帐户很年轻,但在授权URL中发布回调URL不再有效,正如他所说的。我问在Twitter上,这里是约翰鹀的回答是:

https://twitter.com/codingjester/status/313248230987157505

我成功地能够使用以下(在Python这里)重新路由我的回调URL,分配所有适当的键后:

consumer = oauth.Consumer(consumer_key, consumer_secret) 
client = oauth.Client(consumer) 
resp, content = client.request(request_token_url, "GET") 
resp, content = client.request(request_token_url, "POST", body=urllib.urlencode({"oauth_callback": "[your own URL here]"}))