Tumblr OAuth回调URL
我正在请求头中设置oauth_回调URL,当我在Twitter中这样做时,它工作正常,用户被重定向到回调URL。但是使用Tumblr的API,回调URL被忽略,用户被重定向到默认URL。还有其他人经历过吗?除了标题,还有其他地方需要我设置吗?我试着把它作为一个参数传入,但也没有真正起作用 任何帮助都将不胜感激。Tumblr这样做(我想)是为了安全。它们要求在应用程序注册时定义回调URL,并且不允许在实现过程中覆盖回调URL 安全问题是确保没有人可以窃取您的应用程序令牌,并尝试使用它来利用您的声誉来访问客户的数据。通过强制所有回调转到默认URL,它们可以保证只有您的应用程序才能获得访问令牌 处理这一问题的两种方法是: 1) 让默认URL根据cookie或其他数据重定向到您希望它去的地方 2) 为不同的回调URL使用不同的应用程序令牌。Tumblr这样做(我假设)是为了安全。它们要求在应用程序注册时定义回调URL,并且不允许在实现过程中覆盖回调URL 安全问题是确保没有人可以窃取您的应用程序令牌,并尝试使用它来利用您的声誉来访问客户的数据。通过强制所有回调转到默认URL,它们可以保证只有您的应用程序才能获得访问令牌 处理这一问题的两种方法是: 1) 让默认URL根据cookie或其他数据重定向到您希望它去的地方Tumblr OAuth回调URL,oauth,tumblr,Oauth,Tumblr,我正在请求头中设置oauth_回调URL,当我在Twitter中这样做时,它工作正常,用户被重定向到回调URL。但是使用Tumblr的API,回调URL被忽略,用户被重定向到默认URL。还有其他人经历过吗?除了标题,还有其他地方需要我设置吗?我试着把它作为一个参数传入,但也没有真正起作用 任何帮助都将不胜感激。Tumblr这样做(我想)是为了安全。它们要求在应用程序注册时定义回调URL,并且不允许在实现过程中覆盖回调URL 安全问题是确保没有人可以窃取您的应用程序令牌,并尝试使用它来利用您的声誉
2) 为不同的回调url使用不同的应用程序令牌。如果您正在尝试在回调url中嵌入用户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
回拨时:
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
如果您正在尝试在回调url中嵌入用户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
回拨时:
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
据介绍,这是Tumblr API中的一个bug,已经修复
你们中的许多人都感到沮丧,因为你们无法推翻这一决定
当用户试图授权其权限时的回调url
应用好消息:我们已经修补了导致此问题的bug
具体问题
现在,您可以通过oauth_回调参数传递url,我们将
完成后,将用户重定向到该端点
让我们看一个简单的例子
当用户看到屏幕授权您的应用程序时,您
应该能够用
url中的oauth_回调参数
上面的url将用户重定向到
mysite.com/oauth_callback/testing并让您知道用户是否
批准或拒绝您的应用
2013年3月14日更新:
从今天开始,Tumblr不再考虑oauth_回调参数。我以前链接到的博客帖子已被删除。我最终使用了一个已接受答案的变体来解决它。根据,这是Tumblr API中的一个错误,已经修复
你们中的许多人都感到沮丧,因为你们无法推翻这一决定
当用户试图授权其权限时的回调url
应用好消息:我们已经修补了导致此问题的bug
具体问题
现在,您可以通过oauth_回调参数传递url,我们将
完成后,将用户重定向到该端点
让我们看一个简单的例子
当用户看到屏幕授权您的应用程序时,您
应该能够用
url中的oauth_回调参数
上面的url将用户重定向到
mysite.com/oauth_callback/testing并让您知道用户是否
批准或拒绝您的应用
2013年3月14日更新:
从今天开始,Tumblr不再考虑oauth_回调参数。我以前链接到的博客帖子已被删除。我最终使用了一个已接受答案的变体来解决这个问题。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。要指定其他URL,应执行以下操作:
@request_token = @oauth.get_request_token
redirect_to @request_token.authorize_url + '&' + { oauth_callback:@callback_url }.to_query
这与他们的文档/博客文章(在另一个答案中引用)一致。根据OAuth 1.0a规范,我没有检查这是否“正确”。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。要指定其他URL,应执行以下操作:
@request_token = @oauth.get_request_token
redirect_to @request_token.authorize_url + '&' + { oauth_callback:@callback_url }.to_query
这与他们的文档/博客文章(在另一个答案中引用)一致。根据OAuth 1.0a规范,我还没有检查这是否“正确”。我无法回复Jonathan Tran的回答,因为我的帐户还年轻,但如他所说,在授权URL中发布回调URL不再有效。我在推特上问道,以下是约翰·邦廷的回答: 在分配了所有正确的键之后,我成功地使用以下命令(在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]"}))
我无法回答乔纳森·特兰的回答,因为我的账户还年轻,但阿宝