OAuth2 :: Error,invalid_request:redirect_uri与应用程序配置不匹配

时间:2017-06-27 03:51:42

标签: ruby-on-rails ruby heroku oauth omniauth

我正在开发使用this gem使用Bungie OAuth进行身份验证的rails应用。我在initializers / devise.rb中的配置如下:

config.omniauth :bungie, ENV['CLIENT_ID'], ENV['CLIENT_SECRET'], ENV['X_API_KEY'], ENV['REDIRECT_URL']

Bungie的开发人员门户需要使用HTTPS的重定向网址,因此我已将我的应用程序推送到Heroku并使用a redirect强制身份验证返回localhost进行测试。使用这种方法,一切正常。但是,当我将应用程序推送到生产环境时,Bungie对我的应用程序的响应失败了OAuth2::Error, invalid_request: redirect_uri does not match application configuration redirect_url在我的应用程序的env变量和Bungie的开发门户中完全相同。

看到它正在制作中,我只能看到我能看到的日志。我已尝试在浏览器中的开发工具的网络标签中跟踪请求,但一切看起来都应该如此。

我曾尝试与bungie-oauth2 gem的开发人员合作,但我们未能达成解决方案(并且他的prod应用程序可以正常使用)。

在Heroku中是否有任何可能导致redirect_url不同的内容?

根据要求,这是我的omniauth路线:

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }

rake routes的输出:

 users_sign_out GET      /users/sign_out(.:format)             devise/sessions#destroy
          new_user_session GET      /users/sign_in(.:format)              devise/sessions#new
              user_session POST     /users/sign_in(.:format)              devise/sessions#create
      destroy_user_session DELETE   /users/sign_out(.:format)             devise/sessions#destroy
user_bungie_omniauth_authorize GET|POST /users/auth/bungie(.:format)          users/omniauth_callbacks#passthru
user_bungie_omniauth_callback GET|POST /users/auth/bungie/callback(.:format) users/omniauth_callbacks#bungie
         new_user_password GET      /users/password/new(.:format)         devise/passwords#new
        edit_user_password GET      /users/password/edit(.:format)        devise/passwords#edit
             user_password PATCH    /users/password(.:format)             devise/passwords#update
                           PUT      /users/password(.:format)             devise/passwords#update
                           POST     /users/password(.:format)             devise/passwords#create
  cancel_user_registration GET      /users/cancel(.:format)               devise/registrations#cancel
     new_user_registration GET      /users/sign_up(.:format)              devise/registrations#new
    edit_user_registration GET      /users/edit(.:format)                 devise/registrations#edit
         user_registration PATCH    /users(.:format)                      devise/registrations#update
                           PUT      /users(.:format)                      devise/registrations#update
                           DELETE   /users(.:format)                      devise/registrations#destroy
                           POST     /users(.:format)                      devise/registrations#create

和我的控制员:

def bungie
  @user = User.from_omniauth(request.env["omniauth.auth"])

  if @user.persisted?
    @user.remember_me = true
    sign_in_and_redirect @user, :event => :authentication
  else
    session["devise.bungie_data"] = request.env["omniauth.auth"]
    redirect_to root_path
  end
end

可在https://github.com/destiny-aviato/destinder找到完整来源。

2 个答案:

答案 0 :(得分:4)

在您的身份验证请求中将redirect_uri param编码为bungie跳出来:

https%25253A%25252F%25252Fdestinder.herokuapp.com%25252Fusers%25252Fauth%25252Fbungie%25252Fcallback

要简单地阅读它,我必须将它解码三次。通常,params只编码一次

URI.decode(URI.decode(URI.decode("https%25253A%25252F%25252Fdestinder.herokuapp.com%25252Fusers%25252Fauth%25252Fbungie%25252Fcallback")))

不确定这是否是造成问题的原因。您可以查看从本地点击时request_uri编码的次数。如果它小于3,那么在heroku部署期间,request_uri会被编码一次。

要获取本地request_uri,请从bungie注销,点击"使用bungie登录"在你当地。浏览器中的网址将为request_uri

答案 1 :(得分:-1)

在凭证

中替换Heroku应用程序的重定向网址