Ruby on rails omniauth-twitter 和设计

Posted

技术标签:

【中文标题】Ruby on rails omniauth-twitter 和设计【英文标题】:Ruby on rails omniauth-twitter and devise 【发布时间】:2014-08-14 20:18:58 【问题描述】:

我尝试实现 oauth-twitter gem 以允许我的用户使用 twitter 注册/登录,问题是当用户在 twitter 上接受我的应用程序后被重定向时,它会将他重定向到注册页面。

这是我的配置:

app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
     def twitter
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "Twitter") if is_navigational_format?
    else
      session["devise.twitter.data"] = request.env["omniauth.auth"].except("extra")
      redirect_to new_user_registration_url
    end   end

end

然后是我的 app/models/users.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  devise :omniauthable, :omniauth_providers => [:twitter]

def self.from_omniauth(auth)
  where(auth.slice(:provider, :uid)).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name   # assuming the user model has a name
  end
end


def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.twitter_data"] && session["devise.twitter_data"]["extra"]["raw_info"]
        user.email = data["email"] if user.email.blank?
      end
    end
  end


end

我的宝石文件

source 'https://rubygems.org'
ruby '2.1.1'

gem 'rails', '4.0.0'
gem "sass-rails", "~> 4.0.0"
gem 'uglifier'
gem 'coffee-rails'
gem 'jquery-rails'
gem 'jbuilder', '~> 1.2'
gem 'bootstrap-sass'
gem 'devise'
gem "font-awesome-rails", "~> 4.0.1.0"
gem 'masonry-rails', '~> 0.2.0'
gem "zeroclipboard-rails", "~> 0.0.10"
gem "will_paginate", '~> 3.0'
gem 'intercom-rails', '~> 0.2.24'
gem 'magnific-popup-rails'
gem "rake"
gem 'omniauth-twitter'





group :development, :test do
    gem 'sqlite3'
end

group :production do
    gem 'pg'
    gem 'rails_12factor'
end

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]

在 config/initializers/devise.rb 中

我添加了:

require 'omniauth-twitter'
  config.omniauth :twitter, "APP_ID", "APP_KEY", :strategy_class => OmniAuth::Strategies::Twitter

但是当我的用户通过链接注册时:

 <%= link_to "Sign in with twitter", user_omniauth_authorize_path(:twitter) %>

并在 twitter 上接受我的应用程序,它们将被重定向到注册页面,并且没有填写任何内容,我知道无法通过 twitter 检索电子邮件地址,但是名称呢?应该填名字吧?

感谢您指出什么是错误的

【问题讨论】:

您的视图代码是否使用@user.name 或您尝试自动填写的任何值? @JohnPaulAshenfelter 我不确定你在问什么,但我确实在 app/views/users/show.html.erb 中有它 在用户个人资料页面中显示用户名 【参考方案1】:

请注意,现在可以从 Twitter 检索电子邮件。为此,您必须进入您的 Twitter 开发帐户 (https://developer.twitter.com/en/apps),选择您的应用并进入“权限”设置。在那里,您可以单击“编辑”并选中“向用户请求电子邮件地址”复选框。

之后,您在 Twitter 上的 omniauth 应该可以正常工作。话虽如此,您可能希望告知用户他们遇到的错误。出于这个原因,我会在你的 twitter 方法中添加一个警报通知,以防身份验证失败:

  def twitter
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "Twitter") if is_navigational_format?
    else
      session["devise.twitter.data"] = request.env["omniauth.auth"].except("extra")
      redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
    end   
  end

【讨论】:

【参考方案2】:

在你的用户模型的 new_with_session(params, session) 方法中,你没有从 twitter 的数据返回中检索数据,在那里做一些分配。

【讨论】:

感谢您指出这一点!你能给我一些关于如何从这里获得一些数据返回的建议吗? 看看 twitter api 或者只是将 session["devise.twitter.data"] 值输出到 rails 控制台并得到你想要的。 谢谢 - 我不知道该怎么做?你能给我rails控制台吗?谢谢 @zacchj 这是您键入命令“rails s”以启动rails 服务器的控制台。在您的代码中,您可以使用 puts 来输出所有内容,并且 puts 的结果会显示在该控制台中。

以上是关于Ruby on rails omniauth-twitter 和设计的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.

Ruby on Rails入门篇

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

ruby Ruby on Rails:常见路由

ruby Ruby on rails类

Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門