首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4、Devise、Omniauth (具有多个提供者)

Rails 4、Devise、Omniauth (具有多个提供者)
EN

Stack Overflow用户
提问于 2014-01-21 13:20:18
回答 3查看 11.7K关注 0票数 24

我花了几天时间在devise和omniauth上观看RailsCasts,然后浏览了使用这些gem设置身份验证系统的相关教程。我认为RailsCasts已经过时了,试图修补与其他教程之间的差距会造成各种问题。

请任何人建议一个当前的教程,我可以用来作为实现这个系统的基础。我有单独的用户和身份验证模型(用户有多个身份验证)。

我真的很想在Rails4上使用devise和omniauth (使用CanCan的功能),但我正在努力寻找基本的设置(使用psql作为数据库)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-05 08:24:58

要将Devise与多个身份验证提供程序一起使用,您还需要一个模型-授权

代码语言:javascript
复制
#authorization.rb

# == Schema Information
#
# Table name: authorizations
#
#  id           :integer          not null, primary key
#  user_id      :integer
#  provider     :string(255)
#  uid          :string(255)
#  token        :string(255)
#  secret       :string(255)
#  created_at   :datetime
#  updated_at   :datetime
#  profile_page :string(255)
#

class Authorization < ActiveRecord::Base
  belongs_to :user
end

这里有用户模型的代码

代码语言:javascript
复制
#user.rb

SOCIALS = {
  facebook: 'Facebook',
  google_oauth2: 'Google',
  linkedin: 'Linkedin'
}


has_many :authorizations

def self.from_omniauth(auth, current_user)
  authorization = Authorization.where(:provider => auth.provider, :uid => auth.uid.to_s, 
                                      :token => auth.credentials.token, 
                                      :secret => auth.credentials.secret).first_or_initialize
  authorization.profile_page = auth.info.urls.first.last unless authorization.persisted?
  if authorization.user.blank?
    user = current_user.nil? ? User.where('email = ?', auth['info']['email']).first : current_user
    if user.blank?
      user = User.new
      user.skip_confirmation!
      user.password = Devise.friendly_token[0, 20]
      user.fetch_details(auth)
      user.save
    end
    authorization.user = user
    authorization.save
  end
  authorization.user
end

def fetch_details(auth)
  self.name = auth.info.name
  self.email = auth.info.email
  self.photo = URI.parse(auth.info.image)
end

最后,您需要重写Devise控制器的方法

代码语言:javascript
复制
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def all
    user = User.from_omniauth(env['omniauth.auth'], current_user)
    if user.persisted?
      sign_in user
      flash[:notice] = t('devise.omniauth_callbacks.success', :kind => User::SOCIALS[params[:action].to_sym])
      if user.sign_in_count == 1
        redirect_to first_login_path
      else
        redirect_to cabinet_path
      end
    else
      session['devise.user_attributes'] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  User::SOCIALS.each do |k, _|
    alias_method k, :all
  end
end

如果您需要一些用于提供者,例如Twitter,您需要覆盖twitter方法,因为它不提供用户电子邮件,您应该以其他方式保存它的凭据。

此外,您还应该对路线进行一些更改

代码语言:javascript
复制
devise_for :users,
           :controllers => {
             :omniauth_callbacks => 'users/omniauth_callbacks',
           }
票数 34
EN

Stack Overflow用户

发布于 2014-04-20 22:01:10

你应该试一试这个宝石。https://github.com/AlexanderZaytsev/domp快速且易于集成。我在大约30米的时间里完成了一个有效的设置。

票数 3
EN

Stack Overflow用户

发布于 2014-03-02 20:50:55

在您的初始化程序中,尝试这样做

代码语言:javascript
复制
#config/initializers/devise.rb
  #provider1
  config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET'],
    :site => 'https://graph.facebook.com/',
    :authorize_path => '/oauth/authorize',
    :access_token_path => '/oauth/access_token',
    :scope => 'email, user_birthday, read_stream, read_friendlists, read_insights, read_mailbox, read_requests, xmpp_login, user_online_presence, friends_online_presence, ads_management, create_event, manage_friendlists, manage_notifications, publish_actions, publish_stream, rsvp_event, user_about_me, user_activities, user_birthday, user_checkins, user_education_history, user_events, user_groups, user_hometown, user_interests, user_likes, user_location, user_notes, user_photos, user_questions, user_relationships, user_relationship_details, user_religion_politics, user_status, user_subscriptions, user_videos, user_website, user_work_history'

  #provider2
  config.omniauth :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET'],
    :scope => {
     :secure_image_url => 'true',
     :image_size => 'original',
     :authorize_params => {
       :force_login => 'true'
     }
   }

  #provider3
  config.omniauth :google_oauth2, ENV["GOOGLE_KEY"], ENV["GOOGLE_SECRET"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21249749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档