我花了好几天时间在设计和omniauth上观看RailsCasts,然后通过相关教程来设置使用这些gem的身份验证系统.我认为RailsCasts已经过时了,试图用其他教程修补差距会产生各种各样的问题.
请任何人都可以建议我可以用作实施该系统的基础的当前教程.我有单独的用户和身份验证模型(用户有许多身份验证).
我真的很喜欢在rails 4上使用设计和omniauth(使用CanCan的能力),但是在尝试找到基本设置(使用psql作为数据库)时,我正在撕裂我的头发.
我一直在寻找这个问题的可靠解决方案,并遇到了这个问题,这与我的困境相匹配,但并不完全如此.
目前我的iPhone应用程序通过Basic Auth使用我的Rails API进行身份验证.它只是你简单的,普通的设计auth包.然后我按照说明设置omniauth-facebook for devise并在浏览器端工作.
我无法弄清楚如何做的部分是如何将在iPhone端收到的令牌(通过Facebook iOS SDK)发送到服务器.我希望服务器检查用户表以查看该facebook用户是否已注册,如果他没有,则为他创建一个帐户.然后,我在想服务器会生成一个随机密码并将其发送回客户端设备,以便我可以保持相同的基本身份验证策略.这是实现Web应用程序和iPhone应用程序单点登录的正确方法吗?如何修改服务器端软件包以支持通过手机发送的令牌进行身份验证?
我正在使用Rails + Devise + OmniAuth + Google OAuth2.
我的用户模型(user.rb)包含:
devise :registerable, :omniauthable, :omniauth_providers => [:google_oauth2]
Run Code Online (Sandbox Code Playgroud)
我的routes.rb看起来像:
Rails.application.routes.draw do
devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' }
devise_scope :user do
get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session
post 'sign_in', :to => 'devise/session#create', :as => :user_session
get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end
get 'services', to: 'static_pages#services'
get 'my_account', to: 'my_account#index'
get 'invite', to: 'invite#show'
get 'invite/:id', to: 'invite#show'
root 'static_pages#home'
end
Run Code Online (Sandbox Code Playgroud)
当我去/ sign_in时,我得到一个例外:
undefined method `session_path' for #<#<Class:0x007f9b7173af28>:0x007f9b713d8da8>
Run Code Online (Sandbox Code Playgroud)
在: …
我刚刚得到"Devise 1.2支持与OmniAuth教程的集成",但是我想设置多个提供者来引用同一个用户.我正在寻找一些好的示例代码来查看.
我也不能肯定"多供应商"是可能的默认"色器件:omniauthable"的实施,我想达到"一个用户的许多供应商"的效果,如由Ryan贝茨描述235 omniauth部分-1 ,236 -omniauth-part-2但是我想问一下,如果你已经知道一些例子,你认为是否可以采用更干净的方式,更少被黑客攻击的混合模型.
在此先感谢luca
我正在尝试通过Facebook或Twitter对用户进行身份验证,让他们填写他们的信息,然后单击"保存"(从而创建用户记录).我在最后一步得到一个OpenSSL错误 - 点击保存后.这发生在Devise RegistrationsController #create方法中.
所以我在我的Rails应用程序中收到此错误,在Heroku上托管:
2012-07-28T18:25:13+00:00 app[web.1]: OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)
Run Code Online (Sandbox Code Playgroud)
我见过很多解决方案,但都没有.以下是我尝试过的一些事情:
1)安装certified宝石
2)将Heroku宝石升级到v2.30,再次推动
3)这个:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, TWITTER_KEY, TWITTER_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:scope => "publish_actions,user_location,email", :client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end
Run Code Online (Sandbox Code Playgroud)
似乎有一个问题可能是这个证书文件实际上并不存在 - 我已经在几个地方看到了它,而且看起来这是Heroku的ca_cert文件的默认路径,但我可能是错的.
奇怪的是,这是在我通过FB/Twitter进行身份验证之后发生的,并且我正在尝试创建用户的帐户.为什么会这样,我该如何解决/调试呢?真诚的困惑.
更新:我将此行添加到Omniauth初始化程序,现在它"正常".因此,我已经诊断出问题出在Omniauth上.但是,我还想进行SSL验证......这显然会留下安全漏洞.
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
我有一个使用Facebook API的rails应用程序.我已经看到几种不同的Ruby宝石可以与Facebook集成,但它们看起来过时了.
自己写低级别电话最好吗?有没有像样的当前宝石?
最近有没有改变这些宝石?
我正在开始一个新项目 - 我应该在2012年9月使用哪种宝石?
所以,我只是通过https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview使用Rails 3,Devise和OmniAuth进行设置.
我通过Facebook成功验证了用户身份,但尽管被标记为以下内容,但它们并非"可记忆":
devise [...]: rememberable, :omniauthable
Run Code Online (Sandbox Code Playgroud)
我试着打电话:
@the_user.remember_me!
Run Code Online (Sandbox Code Playgroud)
......无济于事 没有存储/设置cookie,这意味着用户不会跨会话持久存在.
有没有人设法通过cookie记住来自FB的用户?在我看来,这应该是自动发生的.
感谢您提出的任何想法或反馈.
我正在使用devise 2.0和gem omniauth-twitter
问题是twitter没有响应发送电子邮件,因此我的应用程序的模型用户验证了有一封电子邮件,我在回调中收到以下错误:
Email can't be blank
Run Code Online (Sandbox Code Playgroud)
我在我的user.rb模型中有这个:
#config omniauth twitter
def self.find_for_twitter_oauth(access_token, signed_in_resource = nil)
data = access_token.extra.raw_info
if user = User.where(:username => data.screen_name).first
user
else
User.create!(:username => data.screen_name, :password => Devise.friendly_token)
end
end
Run Code Online (Sandbox Code Playgroud)
我在omniauth_callbacks_controller.rb中有这个
def twitter
@user = User.find_for_twitter_oauth(request.env["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
sign_in_and_redirect @user, :event => :authentication
else
# http://stackoverflow.com/questions/7117200/devise-for-twitter-cookie-overflow-error
session["devise.twitter_data"] = request.env["omniauth.auth"].except('extra')
redirect_to new_user_registration_url
end
end
Run Code Online (Sandbox Code Playgroud)
我希望用户强制为发送简报,广告客户等提供电子邮件地址
我该如何解决这个问题?
谢谢!
我收到一个错误:
OmniAuth::Strategies::Facebook::NoAuthorizationCodeError (must pass either a
`code` parameter or a signed request (via `signed_request` parameter or a
`fbsr_XXX` cookie)):
Run Code Online (Sandbox Code Playgroud)
它不是一直都会来的.它会偶尔出现,由airbrake通知.
谷歌搜索有很多链接,但无法找到合适的解决方案..任何人?omizersuth.rb在initializers目录下:
OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}, :scope => 'user_about_me,email,publish_actions,user_location,publish_stream,offline_access,user_interests,user_likes,user_hometown', :display => 'popup'}
OmniAuth.config.on_failure = Proc.new do |env|
#this will invoke the omniauth_failure action in SessionsController.
"SessionsController".constantize.action(:omniauth_failure).call(env)
end
end
Run Code Online (Sandbox Code Playgroud)
PS:我正在使用facebook javascript sdk和facebook-omniauth
我已经阅读了很多关于Omniauth和OAuth2的内容,以及Omniauth如何使用OAuth,但我并不了解每个内容的目标是什么.
例如,我知道有了Omniauth,我可以回复发送params
@auth [ 'omniauth.params']
但如果我使用OAuth,没有Omniauth,我可以这样做吗?
我真正的问题是我不明白它们之间的区别,Omniauth的结束和OAuth的开始,以及我可以用Omuth来做什么,这是OAuth无法实现的.