我正在开发使用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
答案 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应用程序的重定向网址