omn​​iauth的设计和路线

时间:2014-06-08 20:16:21

标签: ruby-on-rails ruby devise linkedin omniauth

我正在使用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]

我在这里缺少什么?

谢谢

2 个答案:

答案 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