gpt4 book ai didi

ruby-on-rails - 让 (omniauth-facebook) 和 (omniauth-twitter) 工作

转载 作者:行者123 更新时间:2023-11-30 05:18:24 26 4
gpt4 key购买 nike

我正在使用:

  • Ruby on Rails 4
  • 设计 3.0.3
  • omniauth (1.1.4)
  • omniauth-facebook (1.4.1)
  • omniauth-twitter (1.0.0)

我最近设置了我的 omniauth-facebook,一切正常。现在我想添加 omniauth-twitter 但不知何故我把事情搞砸了,非常糟糕。

1.) 为了设置我的 Omniauth-Facebook,我这样做了(简而言之):

gem 'omniauth'
gem 'omniauth-facebook'

2.) 在我的用户模型中添加了列“provider”和“uid”。

3.) 接下来,我在我的 config/initializers/devise.rb 中声明了提供者:

require "omniauth-facebook"
config.omniauth :facebook, "App_ID", "App_Secret",
{:scope => 'email,offline_access',
:client_options => {:ssl => {:ca_file => 'lib/assets/cacert.pem'}},
:strategy_class => OmniAuth::Strategies::Facebook}

4.) 我编辑了我的模型 User.rb

# Facebook Settings
def self.find_for_facebook_oauth(auth, signed_in_resource = nil)
user = User.where(provider: auth.provider, uid: auth.uid).first
if user.present?
user
else
user = User.create(first_name:auth.extra.raw_info.first_name,
last_name:auth.extra.raw_info.last_name,
facebook_link:auth.extra.raw_info.link,
user_name:auth.extra.raw_info.name,
provider:auth.provider,
uid:auth.uid,
email:auth.info.email,
password:Devise.friendly_token[0,20])
end
end

并添加了要设计的属性:

:omniauth_providers => [:facebook]

5.) 我编辑了路线:

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

结束

虽然这对 Facebook 非常有效,但我已经尝试了几个小时来让它对 Twitter 有效,但我就是想不通。

如果有人在这方面有经验,或者只知道解决方案可以帮助我设置它,我将非常感激 :)

谢谢大家,很抱歉发了这么长的帖子。

此外

Twitter 不提供 :email 属性,所以我猜我必须拆分我的用户注册流程?

我的Twitter 在我的用户模型 中的操作

# Twitter Settings
def self.find_for_twitter_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth[:provider], :uid => auth[:uid]).first
unless user
user = User.create(:first_name => auth[:name],
:user_name => auth[:screen_name],
:provider => auth[:provider], :uid => auth[:uid],
:password => Devise.friendly_token[0,20]
)
end
user
end

# build auth cookie hash for twitter
def self.build_twitter_auth_cookie_hash data
{
:provider => data.provider, :uid => data.uid.to_i,
:access_token => data.credentials.token, :access_secret => data.credentials.secret,
:first_name => data.name, :user_name => data.screen_name,

}
end

我必须为用户迁移可确认的 -> How To: Add :confirmable to Users

我的表格有问题,(至少我现在开始了 :) )

enter image description here

最佳答案

要解决您的电子邮件问题,您可以设置一个虚拟邮件,或添加用户添加他/她的电子邮件的第二个步骤。

虚拟邮件:

class User < ActiveRecord::Base

before_create :set_dummy_mail, if self.provider == "twitter"

private

def set_dummy_mail
self.email = "#{self.name}_email@example.com"
end

end

或者第二步选项:

如果提供商是 Twitter 且电子邮件为空,请修改您的 Controller 以重定向到添加电子邮件步骤。如果提供商是 Twitter,您可能还必须修改验证以允许电子邮件在创建时为空白。

更新:我是这样做的:

gem 文件:

gem "devise"
gem "omniauth"
gem "omniauth-facebook"
gem "omniauth-twitter"

我用过:

  • 设计2.2.3版本
  • omniauth 1.1.4
  • omniauth-facebook 1.3.0
  • omniauth-twitter 0.0.17

如果你使用不同的版本,你可能必须改变一些东西..

路线.rb:

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

devise_scope :user do
post "account/create" => "users/accounts#create"
end

应用程序/模型/user.rb

class User < ActiveRecord::Base

# allow email blank for first create
validates_format_of :email, :with => Devise.email_regexp, :allow_blank => true, :if => :email_changed?

# facebook find method
def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth.provider, :uid => auth.uid).first
unless user
user = User.create(:first_name => auth.extra.raw_info.first_name,
:last_name => auth.extra.raw_info.last_name,
:facebook_link => auth.extra.raw_info.link,
:user_name => auth.extra.raw_info.name
:provider => auth.provider,
:uid => auth.uid, :email => auth.info.email,
:password => Devise.friendly_token[0,20]
)
user.confirm!
end
user
end

# twitter find method
def self.find_for_twitter_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth[:provider], :uid => auth[:uid]).first
unless user
user = User.create(:first_name => auth[:first_name], :user_name => auth[:user_name],
:provider => auth[:provider], :uid => auth[:uid],
:password => Devise.friendly_token[0,20]
)
end
user
end

# build auth cookie hash for twitter
def self.build_twitter_auth_cookie_hash data
{
:provider => data.provider, :uid => data.uid.to_i,
:access_token => data.credentials.token, :access_secret => data.credentials.secret,
:first_name => data.screen_name, :user_name => data.name,

}
end

end

app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

# callback action for facebook auth
def facebook
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

if @user.persisted?
sign_in_and_redirect @user, :event => :authentication
set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end

# callback action for twitter auth
def twitter
data = session["devise.omniauth_data"] = User.build_twitter_auth_cookie_hash(request.env["omniauth.auth"])

user = User.find_for_twitter_oauth(data)
if user.confirmed? # already registered, login automatically
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
sign_in_and_redirect user, :event => :authentication
elsif !user.email?
flash[:error] = "You must add an email to complete your registration."
@user = user
render :add_email
else
flash[:notice] = "Please confirm your email first to continue."
redirect_to new_user_confirmation_path
end
end

end

app/views/users/omniauth_callbacks/add_email.html.erb

<%= form_for(@user, :as => "user", :url => account_create_path, :html => {:class => "form-inline"}) do |f| %>
<%= f.email_field :email, :placeholder => User.human_attribute_name(:email), :class => "input-medium" %>
<%= f.submit "Finish registration", :class => "btn btn-small" %>
<% end %>

app/controllers/users/accounts_controller.rb

class Users::AccountsController < ApplicationController

def create
data = session["devise.omniauth_data"]
data[:email] = params[:user][:email]
user = User.find_for_twitter_oauth(data)
user.email = data[:email]

if user.save
flash[:notice] = I18n.t "devise.registrations.signed_up_but_unconfirmed"
redirect_to root_path
else
flash[:error] = I18n.t "devise.omniauth_callbacks.failure", :kind => data[:provider].titleize, :reason => user.errors.full_messages.first
render "users/omniauth_callbacks/add_email"
end
end

end

也许您必须修改我的解决方案的一部分。您也可以重构用户模型中的两种方法(find_for_facebook_auth、find_for_twitter_auth)以使用一种动态方法。尝试一下,如果仍有问题,请告诉我。如果您发现任何拼写错误,也请告诉我。您还应该编写测试来检查系统中的所有内容。

关于ruby-on-rails - 让 (omniauth-facebook) 和 (omniauth-twitter) 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com