Instagram API返回一个代码,但在请求访问令牌时,相同的代码无效

时间:2015-02-11 00:39:18

标签: android ruby oauth instagram

使用Instagram ruby​​gem和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

然而,当尝试使用相同的路线(在GET oauth / connect,重定向到Instagram,然后重定向回oauth / callback)从Android应用程序的webview中进行身份验证时,我收到以下错误:

Instagram::BadRequest - POST https://api.instagram.com/oauth/access_token/: 400: OAuthException: No matching code found.:

我已经确认我使用的是从Instagram返回的相同代码,并且redirect_uri与我在Instagram上注册的相同。

注意,Oauth在我使用我的网络界面时起作用,但不能通过Android网页视图。

我已经阅读过很多其他人看过这种行为的帖子,但提供的解决方案对我不起作用:

  1. Instagram可以禁用您的应用,因为它认为它行为不端。不,因为oauth通过我的网络界面工作仍然使用相同的客户端ID和秘密以及相同的路线。

  2. 您没有使用与Instagram中列出的相同的redirect_uri。我已检查并重新检查了它,看起来很好。

  3. 我可以在哪里调试以解决此问题的底部?

1 个答案:

答案 0 :(得分:0)

我知道我的回答有点晚了,但我在这里发帖,所以其他人(希望)不必像我那样努力搜索。

看起来你正在使用Explicit auth。我们使用显式流程来解决这个问题。

问题在于:在您将代码发送到Instagram(步骤3)后的瞬间,该代码将过期。但是,Instagram不会向您发送新代码(步骤1和2)至少5分钟(它重新发布旧代码)。

确保您没有使用相同的代码发送多个请求(Android WebView倾向于随意发送多个请求)。或者,更好的是,缓存服务器上的代码 - > Instagram_response映射。