我在请求标头中设置oauth_callback网址,当我在Twitter中执行此操作时,它工作正常,用户被重定向到回调网址。但是使用Tumblr的API,将忽略回调URL,并将用户重定向到默认URL。有没有人经历过这个?除了标题以外的其他地方我应该设置这个吗?我尝试将其作为参数传递,但这也不起作用。
任何帮助都将不胜感激。
答案 0 :(得分:5)
根据Tumblr's developer blog,这是Tumblr API中的一个错误,已经修复。
你们许多人都因为无法覆盖而感到沮丧 用户尝试授权他们时的回调网址 应用。好消息:我们修补了造成这种情况的错误 特别的问题。
现在,您可以使用oauth_callback参数传递一个url,我们会 完成后将用户重定向到该端点。
我们来看一个简单的例子。
当向用户显示授权您的应用的屏幕时,您 应该能够覆盖你的默认回调 您网址中的oauth_callback参数。
http://www.tumblr.com/oauth/authorize?oauth_token=your_token&oauth_callback=http%3A%2F%2Fmysite.com/oauth_callback/testing 上面的url会将用户重定向到 mysite.com/oauth_callback/testing,如果用户有,请告诉您 批准或拒绝了您的应用。
2013年3月14日更新:
从今天开始,Tumblr不再尊重oauth_callback参数。我之前链接到的博客文章已被删除。我最终使用了接受的答案的变体来解决它。
答案 1 :(得分:2)
Tumblr这样做(我假设)是为了安全。它们要求在应用程序注册时定义回调URL,并且在实现过程中不会覆盖它。
安全问题是确保没有人可以窃取您的应用程序令牌并尝试使用它来使用您的声誉来访问客户的数据。通过强制所有回调转到默认URL,他们可以保证只有您的应用程序才能获得访问权限。
处理此问题的两种方法是:
1)让默认网址根据cookie或其他数据重定向到您希望的位置 2)为不同的回调URL提供不同的应用程序令牌。
答案 2 :(得分:2)
我无法回应Jonathan Tran的回答,因为我的帐户很年轻,但在授权网址中发布回调网址不再有效,正如他所说的那样。我在Twitter上问过,这是John Bunting的回复:
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]"}))
答案 3 :(得分:1)
如果您在回调网址中尝试使用嵌入式用户ID,则此帖子可以为您提供帮助 您可以在会话中保存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
答案 4 :(得分:-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规范,我没有检查过这是否“正确”。