Instagram API returns 一个代码,但是在请求访问令牌时说相同的代码无效
Instagram API returns a code, but when requesting an access token says the same code is invalid
使用 Instagram rubygem 和 sinatra,我能够从一个小型 AngularJS 应用程序通过 oauth 成功进行身份验证并使用 Instagram API。以下是我的 sinatra 应用程序中的相关 oauth 路由:
get '/oauth/connect' do
logger.info "going here " + (Instagram.authorize_url :redirect_uri => CALLBACK)
redirect Instagram.authorize_url :redirect_uri => CALLBACK
end
get "/oauth/callback" do
logger.info params[:code]
response = Instagram.get_access_token params[:code], :redirect_uri => CALLBACK
session[:access_token] = response.access_token
users = DB[:users]
current_user = users[:instagram_id => response.user.id.to_i]
if current_user.nil?
new_user = response.user
users.insert :instagram_id => new_user.id.to_i,
:username => new_user.username,
:profile_picture => new_user.profile_picture,
:created_at => DateTime.now
current_user = users[:instagram_id => new_user.id]
end
session[:current_user] = current_user
redirect "/app"
end
但是,当尝试使用相同的路由从 Android 应用程序的网络视图中进行身份验证时(GET oauth/connect,重定向到 Instagram,然后重定向回 oauth/callback)我出现以下错误:
Instagram::BadRequest - POST https://api.instagram.com/oauth/access_token/: 400: OAuthException: No matching code found.:
我已确认我使用的是从 Instagram 返回的相同代码,并且 redirect_uri 与我在 Instagram 注册的相同。
请注意,Oauth 在我使用网络界面时有效,但在 Android 网络视图中无效。
我阅读了很多其他人看到过这种行为的帖子,但提供的解决方案对我不起作用:
Instagram 可以禁用您的应用程序,因为它认为它行为不当。不,因为 oauth 通过我的网络界面工作,仍然使用相同的客户端 ID 和密码以及相同的路由。
您使用的 redirect_uri 与 Instagram 列出的不一样。我检查并重新检查了这个,看起来不错。
接下来我可以在哪里调试以深入了解这个问题?
我知道我的回答有点晚了,但我把它贴在这里是为了让其他人(希望)不必像我一样努力搜索。
您似乎在使用显式身份验证。我们在使用显式流程时遇到了这个问题。
问题在于:在您将代码发送到 Instagram(第 3 步)后,该代码立即过期。但是,Instagram 在至少 5 分钟内不会向您发送新代码(第 1 步和第 2 步)(它会重新发布旧代码)。
确保您没有发送多个具有相同代码的请求(Android WebView 倾向于任意发送多个请求)。或者,更好的是,在服务器上缓存代码->Instagram_response 映射。
使用 Instagram rubygem 和 sinatra,我能够从一个小型 AngularJS 应用程序通过 oauth 成功进行身份验证并使用 Instagram API。以下是我的 sinatra 应用程序中的相关 oauth 路由:
get '/oauth/connect' do
logger.info "going here " + (Instagram.authorize_url :redirect_uri => CALLBACK)
redirect Instagram.authorize_url :redirect_uri => CALLBACK
end
get "/oauth/callback" do
logger.info params[:code]
response = Instagram.get_access_token params[:code], :redirect_uri => CALLBACK
session[:access_token] = response.access_token
users = DB[:users]
current_user = users[:instagram_id => response.user.id.to_i]
if current_user.nil?
new_user = response.user
users.insert :instagram_id => new_user.id.to_i,
:username => new_user.username,
:profile_picture => new_user.profile_picture,
:created_at => DateTime.now
current_user = users[:instagram_id => new_user.id]
end
session[:current_user] = current_user
redirect "/app"
end
但是,当尝试使用相同的路由从 Android 应用程序的网络视图中进行身份验证时(GET oauth/connect,重定向到 Instagram,然后重定向回 oauth/callback)我出现以下错误:
Instagram::BadRequest - POST https://api.instagram.com/oauth/access_token/: 400: OAuthException: No matching code found.:
我已确认我使用的是从 Instagram 返回的相同代码,并且 redirect_uri 与我在 Instagram 注册的相同。
请注意,Oauth 在我使用网络界面时有效,但在 Android 网络视图中无效。
我阅读了很多其他人看到过这种行为的帖子,但提供的解决方案对我不起作用:
Instagram 可以禁用您的应用程序,因为它认为它行为不当。不,因为 oauth 通过我的网络界面工作,仍然使用相同的客户端 ID 和密码以及相同的路由。
您使用的 redirect_uri 与 Instagram 列出的不一样。我检查并重新检查了这个,看起来不错。
接下来我可以在哪里调试以深入了解这个问题?
我知道我的回答有点晚了,但我把它贴在这里是为了让其他人(希望)不必像我一样努力搜索。
您似乎在使用显式身份验证。我们在使用显式流程时遇到了这个问题。
问题在于:在您将代码发送到 Instagram(第 3 步)后,该代码立即过期。但是,Instagram 在至少 5 分钟内不会向您发送新代码(第 1 步和第 2 步)(它会重新发布旧代码)。
确保您没有发送多个具有相同代码的请求(Android WebView 倾向于任意发送多个请求)。或者,更好的是,在服务器上缓存代码->Instagram_response 映射。