我正在使用Devise进行身份验证用户,这就是 routes.rb 文件中的内容:
devise_for :users, :path_names => { :sign_in => 'login', :sign_out => 'logout', :password => 'secret',
:confirmation => 'verification', :unlock => 'unlock', :registration => 'register',
:sign_up => 'signup' }
我为omniauth添加了一部分(对于LinkedIn):
devise_for :users, :path_names => { :sign_in => 'login', :sign_out => 'logout', :password => 'secret',
:confirmation => 'verification', :unlock => 'unlock', :registration => 'register',
:sign_up => 'signup' }, :controllers => { :omniauth_callbacks => "omniauth_callbacks" }
在视图中:
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. Not you?
<%= link_to "Sign out", destroy_user_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_user_registration_path %> or
<%= link_to "Sign in", new_user_session_path %>
<%= link_to "Sign in with Linkedin",user_omniauth_authorize_path(:linkedin) %>
<% end %>
错误:
No route matches {:controller=>"omniauth_callbacks", :action=>"passthru", :provider=>:linkedin, :format=>nil} missing required keys: [:provider]
我在这里缺少什么?
谢谢
答案 0 :(得分:1)
在所有引用的地方验证提供商的一致拼写 以下数据是一个例子:facebook作为提供者。
带有设计omniauthable调用的模型文件
# app/models/User.rb
devise :omniauthable, :omniauth_providers => [:facebook]
为提供商设计配置
# app/config/initializers/devise.rb
config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], scope: 'email', info_fields: 'email, name'
^ - 此外,注册提供商以获取您的开发者APP_ID&amp; APP_SECRET
Callbacks Controller:
# app/controllers/callbacks_controller.rb
def facebook
@user = User.from_omniauth(request.env["omniauth.auth"])
... more code here, excess omitted ...
end
视图文件中的URI路径
# apps/views/shared/_footer.html.erb
user_omniauth_authorize_path(:facebook)
在这种情况下,我只使用提供者特定的gem:
# app_name/Gemfile
gem 'omniauth-facebook'
我没有使用#omniauth gem,因为devise是omniauthable(我们在initialize中使用devise.rb而不是omniauth.rb作为中间件配置)。参考:设计概述维基下面的开始之前段落:https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview
仍然没有爱情?然后我会检查omniauth- 提供程序 gem以查找正在使用的任何细节。 Facebook在2015年7月至8月期间更改了他们的OAuth API,因此需要配置中的最后一部分(如上所示,Devise Config,devise.rb)来获取用户的电子邮件地址和名称:
info_fields: 'email, name'
答案 1 :(得分:0)
这样做
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. Not you?
<%= link_to "Sign out", destroy_user_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_user_registration_path %> or
<%= link_to "Sign in", new_user_session_path %>
<%= link_to "Sign in with Linkedin",user_omniauth_authorize_path(provider: :linkedin) %>
<% end %>
omniauth路径选择provider
。