[英]Ruby on rails omniauth-twitter and devise
我尝试实现 oauth-twitter gem 以允许我的用户使用 twitter 注册/登录,问题是当用户在 twitter 上接受我的应用程序后重定向时,它将他重定向到注册页面。
这是我的配置:
应用程序/控制器/用户/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
然后我的应用程序/模型/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
我的 Gemfile
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 检索电子邮件地址,但是名称呢? 应该填名字吗?
感谢您指出什么是错误的
请注意,现在可以从 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
在您的 User 模型的 new_with_session(params, session) 方法中,您没有从 twitter 返回的数据中检索数据,在那里做一些分配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.