- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在我的项目中,我有两类用户:求职者和招聘经理。求职者没有模型,他们只能使用从第三方供应商处收到的数据申请工作,同时通过 Omniauth 进行身份验证。招聘经理的信息存储在设计用户模型中。招聘经理还必须能够使用其公司的 Google 电子邮件帐户登录。因此,首先我使用 Omniauth 1.0.0、Rails 3.1.3 构建求职者身份验证:
omniauth.rb
require 'omniauth-openid'
require 'openid/store/filesystem'
Rails.application.config.middleware.use OmniAuth::Builder do
provider :openid, :store => OpenID::Store::Filesystem.new('./tmp'), :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id'
provider :facebook, "xxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
{:scope => 'email, offline_access, publish_stream', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}}
provider :twitter, "xxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
provider :linkedin, "xxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxx"
end
在 routes.rb
中:
match '/auth/:provider/callback', :to => 'sessions#authenticate_jobseeker'
match '/auth/failure', :to => 'sessions#failure'
在 sessions_controller.rb
def authenticate_jobseeker
session[:jobseeker] = request.env['omniauth.auth']
if valid_job_seeker?
redirect_to new_job_application_path(...)
else
redirect_to request.env['omniauth.origin'] || root_path, alert: "Authentication failure"
end
end
到目前为止,一切正常。但是,当我开始为用户模型实现 Google 登录并向其添加 :omniauthable 时,我的求职者身份验证失败了。我正在使用 Devise 1.5.2:
user.rb
class User < ActiveRecord::Base
#...
devise :database_authenticatable, :registerable,
... :lockable, :omniauthable
#...
end
在 devise.rb
中:
config.omniauth :open_id, :store => OpenID::Store::Filesystem.new('./tmp'), :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id', :require => 'omniauth-openid'
在 routes.rb
中:
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } do
get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
end
此时,用户的身份验证有效,但求职者的身份验证无效。搜索了一段时间后,通过向 omniauth.rb
中的每个提供程序添加 :path_prefix => "/auth"
解决了这个问题。现在唯一的问题是,当求职者不允许访问其数据(即按“不允许”并返回到应用程序)时,我会为每个提供者跟踪 RuntimeError:
Could not find a valid mapping for path "/auth/twitter/callback"
Parameters:
{"denied"=>"mKjVfMRwRAN12ZxQ9cxCoD4rYSLJIRLnEqgiI"}
跟踪的顶部:
devise (1.5.2) lib/devise/mapping.rb:48:in `find_by_path!'
devise (1.5.2) lib/devise/omniauth.rb:17:in `block in <top (required)>'
omniauth (1.0.0) lib/omniauth/strategy.rb:418:in `call'
omniauth (1.0.0) lib/omniauth/strategy.rb:418:in `fail!'
omniauth-oauth (1.0.0) lib/omniauth/strategies/oauth.rb:63:in `rescue in callback_phase'
omniauth-oauth (1.0.0) lib/omniauth/strategies/oauth.rb:45:in `callback_phase'
omniauth (1.0.0) lib/omniauth/strategy.rb:200:in `callback_call'
omniauth (1.0.0) lib/omniauth/strategy.rb:166:in `call!'
omniauth (1.0.0) lib/omniauth/strategy.rb:148:in `call'
omniauth (1.0.0) lib/omniauth/strategy.rb:168:in `call!'
omniauth (1.0.0) lib/omniauth/strategy.rb:148:in `call'
omniauth (1.0.0) lib/omniauth/strategy.rb:168:in `call!'
omniauth (1.0.0) lib/omniauth/strategy.rb:148:in `call'
omniauth (1.0.0) lib/omniauth/builder.rb:30:in `call'
我一直在努力解决这个问题。任何帮助是极大的赞赏。如果我可以提供更多信息,请告诉我。
最佳答案
回答我自己的问题。因此,最终决定采用纯粹的 Omniauth 实现。我从 User
模型中删除了 :omniauthable
,从 devise.rb
中删除了 config.omniauth...
,删除了 :omniauth_callbacks
从 routes.rb
设计路由。因此,所有用户(无论什么角色)都将使用相同的回调路由并点击 sessions_controller#authenticate_jobseeker
操作(应该考虑重命名操作?):
def authenticate_jobseeker
auth_hash = request.env['omniauth.auth']
unless auth_hash.present?
redirect_to request.env['omniauth.origin'] || root_path, alert: "Sorry, we were not able to authenticate you" and return
end
@user = User.find_from_oauth(auth_hash)
if @user.present?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
sign_in_and_redirect @user, :event => :authentication and return
else
session[:jobseeker] = auth_hash["info"]
if valid_job_seeker?
redirect_to new_job_application_path(...)
end
end
end
和User.find_from_oauth
:
def self.find_from_oauth(auth_hash)
if auth_hash
user = User.where(:email => auth_hash["info"]["email"]).first
end
user
end
此实现满足所有要求。
关于ruby-on-rails - Devise omniauthable 使用 `Could not find a valid mapping for path` 破坏 Omniauth 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8577089/
我已经将 gitlab 全部设置好并准备好omniauth,我想知道是否可以完全禁用使用密码和用户名的默认身份验证并仅使用omniauth(在我们的例子中为google登录)。我希望通过将 Googl
我是 Rails 和 Omniauth 的新手,所以提前为愚蠢的人感到抱歉 题。 我正在尝试为 Deezer 网站制定 Omniauth 策略。 http://www.deezer.com/en/de
所以我试图让 omniauth-facebook 在我的生产环境中工作。它使用 POW 在我的机器上本地运行良好。 我的产品环境是带有 nginx/unicorn 的 ubuntu,代码是 Rails
嗨,我正在学习如何使用omniauth 作为 ember 应用程序的后端。 当我运行我的应用程序时,我得到下面提到的错误 OmniAuth::NoSessionError - 您必须提供 sessio
我正在使用: Ruby on Rails 4 设计 3.0.3 omniauth (1.1.4) omniauth-facebook (1.4.1) omniauth-twitter (1.0.0)
如果我使用 omniauth 进行 Twitter 验证.. 下面的代码是 def create user = User.from_omniauth(env["omniauth.auth"])
再具体一点: 如果我打电话,我的 Rails 应用程序运行良好 /auth/facebook/callback或 /auth/facebook/callback?format=json 但是当我尝试打
在我的项目中,我有两类用户:求职者和招聘经理。求职者没有模型,他们只能使用从第三方供应商处收到的数据申请工作,同时通过 Omniauth 进行身份验证。招聘经理的信息存储在设计用户模型中。招聘经理还必
我正在尝试在 Rails 3.2.9 中使用 omniauth-facebook 登录 Facebook;我遵循了 Ryan Bates 在 http://railscasts.com/episode
我一直在探索我的 Rails 应用程序的身份验证选项。我需要用户名/密码身份验证以及将用户与其 Facebook、Twitter、Foursquare 等身份链接的选项。我通常会发现人们为此目的使用
关于如何记住我与 Omniauth 一起工作似乎有些困惑。 根据这个wiki ,您需要在 OmniauthCallbacksController 中包含以下内容: remember_me(user)
说我有用户和项目模型。用户和项目与HABTM相关。我的设置实际上比这要复杂一些,但是出于我的问题,我认为这可以做到。 现在,我想使用omniauth通过Twitter,Facebook来验证特定项目,
我正在尝试使用 omniauth 测试一个简单的 facebook 登录。但是,收到一条错误消息,指出“auth”未定义 variable 或 method。 omniauth 测试文档不包含 fac
我在 Twitter 上使用 gem。回调时,检查用户是否存在并创建他或将他发送回主页。 我可能做错了什么,但在我的回调代码中, request.env['omniauth.origin'] 为零 .
我将 OmniAuth 与 Devise 结合使用,以允许用户使用 facebook 登录或使用用户名和密码创建普通帐户。当我最初设置它时,我使用了来自 Railscasts 的优秀指导。 .在 2
我在端口 3101 上运行了一个 Rails 应用程序我通过 Apache 反向代理设置(就像 Phusion 在 this blog post 上建议的那样)将它提供给互联网。 我正在使用 Devi
我正在开发一个 Rails 3.0 应用程序并使用 OmniAuth + Identity 来验证注册。我已经实现了一个通过外键与身份模型相关联的用户模型,并且一切运行良好。现在,我想实现一个忘记密码
我有一个 Rails 应用程序设置为 OAuth2 提供程序(使用 Doorkeeper)。该应用程序为每个用户帐户使用不同的子域(或通过 cname 记录使用完全不同的域) i.e. user1.m
我正在使用 omniauth和 omniauth-identity用于通过 Google、Facebook 和传统用户名/密码进行身份验证。除了身份验证失败的情况外,我的所有工作都很好。失败时,例如输
我正在构建一个网站,并添加了“使用 Slack 登录”按钮。 我正在使用 omniauth-slack(最新的 8b2371),它运行良好。 但我只想允许来自我自己的 Slack 团队的用户。 有te
我是一名优秀的程序员,十分优秀!