- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚完成了 Michael Hartl 教程。我正在尝试实现 omniauth-facebook 来注册和登录用户。我在创建要在 create
中使用的主变量时遇到问题 session Controller 中的操作。我的假设是我应该输入 if else
查看主人是通过facebook还是通过默认表单登录的声明?或者我应该使用 and or
陈述:
(master = Master.find_by(email: params[:session][:email].downcase) || Master.from_omniauth(env["omniauth.auth"])) ?
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to root_url
end
class SessionsController < ApplicationController
def new
end
def create
master = Master.find_by(email: params[:session][:email].downcase)
if master && master.authenticate(params[:session][:password])
sign_in master
redirect_back_or master
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
.
.
.
end
最佳答案
虽然我可能会晚一年回答这个问题,但我仍然认为像一年前一样有同样问题的新观众可能会从以下答案中受益
据我了解,实际问题是:
How does one integrate Facebook Authentication with an Authentication system that is built from Scratch?
rails g migration add_facebook_auth_to_users provider uid
...并将 omniauth-facebook gem 添加到 Gemfile ...
gem 'omniauth-facebook', '2.0.1'
不要忘记运行
bundle install
并在之后迁移您的数据库。
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
if user.activated?
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else
message = "Account not activated. "
message += "Check your email for the activation link."
flash[:warning] = message
redirect_to root_url
end
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def create_facebook
user = User.from_omniauth(env["omniauth.auth"])
log_in user
redirect_back_or user
end
上面的 session Controller 包含两个创建操作。第一个是直接取自书中的原始方法,第二个是我专门用于 Facebook 身份验证的一段代码。
user = User.from_omniauth(env["omniauth.auth"])
有两个目的。创建用户
如果 他/她唯一的 facebook uid 不在数据库中
其他 如果 uid 存在,则在应用程序中记录此人。稍后会详细介绍。
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name unless user.name != nil
user.email = SecureRandom.hex + '@example.com' unless user.email != nil
user.activated = true
user.password = SecureRandom.urlsafe_base64 unless user.password != nil
user.save!
end
end
在这里,我们尝试找到与给定
provider
匹配的用户和
uid
来自散列的值,然后我们调用
first_or_initialize
在这个结果上。这个方法要么返回第一个匹配的记录,要么用传入的参数初始化一个新记录。然后我们调用
tap
在此将该 User 实例传递给块。在块内,我们根据来自 OmniAuth 哈希的值设置用户的各种属性。
unless
感兴趣一些属性初始化之后的语句。那么考虑一下用户想要更新配置文件的情况,比如更改名称或 smth,然后注销。当该用户最终决定重新登录时,
.from_omniauth
方法将覆盖用户有问题的更新到原始 facebook 值,
除非 我们阻止它这样做。
SecureRandom
的使用图书馆。在 Michael Hartl 在其书中使用的传统身份验证中,他介绍了对电子邮件和密码提交的验证。电子邮件既不能是空白也不能被占用。同样,密码的长度必须大于 6 个字符。由于电子邮件必须存在且独一无二,我决定创建
假人使用
SecureRandom.hex + @example.com
的电子邮件.这将创建一个随机的十六进制字符串,如
52750b30ffbc7de3b362
,并将其附加到
@example.com
,从而生成唯一的虚拟电子邮件。密码也是如此,但是,我更喜欢使用
SecureRandom.urlsafe_base64
生成一个随机的 base64 字符串。 .要记住的最重要的事情是 Facebook 用户不需要知道这些信息即可登录,因为这是使用 Facebook 身份验证的全部意义所在。如果他们愿意,这允许他们稍后将这些信息与真实数据一起添加。
<% if logged_in? %>
.
.
.
<% else %>
.
.
<li><%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %></li>
<% end %>
get 'auth/:provider/callback' => 'sessions#create_facebook'
到 路线.rb 文件jQuery(function() {
$('body').prepend('<div id="fb-root"></div>');
return $.ajax({
url: window.location.protocol + "//connect.facebook.net/en_US/sdk.js",
dataType: 'script',
cache: true
});
});
window.fbAsyncInit = function() {
FB.init({
appId: 'your_facebook_app_id_goes_here',
version: 'v2.3',
cookie: true
});
$('#sign_in').click(function(e) {
e.preventDefault();
return FB.login(function(response) {
if (response.authResponse) {
return window.location = '/auth/facebook/callback';
}
});
});
return $('#sign_out').click(function(e) {
FB.getLoginStatus(function(response) {
if (response.authResponse) {
return FB.logout();
}
});
return true;
});
};
<%= f.email_field :email, value: nil, class: 'form-control' %>
关于ruby-on-rails - Omniauth facebook session Controller 在 Michael Hartl 教程之后创建 Action 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719735/
我正在按照 Hartl 的教程学习 Rails,并对它进行自己的调整。现在,我想扩展它并添加一个发送电子邮件的联系表单。本教程中不包含此类内容,但在第 10 章结束时,我们学会了使用邮件程序方法,并且
这是我在使用 bundle exec rspec spec/requests/static_pages_spec.rb 时遇到的错误。 我已经包含了 gem 测试单元。 请帮助我,我是 Rails 的
我在尝试实现 Hartl 的 Ruby on Rails 教程中的示例应用程序时遇到了一个奇怪的问题。 当我删除微博时,会发生以下情况: 微博被删除。 用户也会被删除。 定向至“注册”页面。 只应该发
我正在学习 Michael Hartl 的优秀 Rails 教程,并且我正在努力了解种子用户的一个方面。我刚刚完成第 9 章,所以我有一个具有管理员权限的工作登录/注销/编辑/删除系统。作为本章的一部
我将表单部分用于创建微博,如 Listing 10.33 所示与 并按照指示更新相应的 View 文件。但是,我无法通过 Rspec 测试,因为我不断收到“未定义的局部变量或类的方法'对象'...”有
我是 Rails 的新手,但我在 hartls 教程的第 11 章中一直遇到问题,目前是 给 Missing partial microposts/_micropost with {:locale=>
阅读 Hartl 的教程,地址为 list 10.42 在 microposts Controller 中,我们有 def create @micropost = current_user
我已经完成了本教程,但自第 7 节制作注册表单以来,我在 CSS 渲染方面遇到了一些小问题。这就是我得到的: 它应该是这样的: 这是相关的 CSS: @mixin box_sizing { -mo
我刚刚完成了 Hartl 教程的第 8 章,但当我尝试运行测试时,不断出现错误。我收到 3 个相同的错误,该问题似乎源于用户登录测试,其中在固定装置集中(用户)中未找到固定装置 :michael。 这
对于我的测试失败的任何帮助,我将不胜感激。我是根据 Michael Hartl 教程做的,我几乎尝试了所有方法并阅读了很多相关内容,但仍然一无所知。坦克斯 我的测试: 描述“分页”做 before(:
我刚刚完成了 Hartl 教程的第 10 章,但我的 CSS 没有加载到 Heroku 中。 我试过运行 $heroku run bundle exec rake assets:precompile
我正在研究 Michael Hartl 的 Ruby on Rails 教程,我在第 9 章遇到了错误。 错误: 1) Error: UsersIndexTest#test_index_as_ad
我是 RoR 的新手,一直在努力完成 Hartl教程(很棒)。我已经成功地跟进了第 9 章(稍微调整了一下,因为我的最终目标不是制作微博站点)。那时,我决定要在我的应用程序中添加一个“记住我”复选框并
我正在关注 Michael Hartl 教程并在 Listing 10.14 之后,他说 There is one subtlety, though: on failed micropost subm
我以前使用过 Rails 并安装了其他版本。我目前正在尝试遵循 Hartl 的教程,他要求使用特定版本的 Rails 和特定的 gem。 当我尝试运行 rails _5.0.3_ new sample
我一直在关注 Ruby-on-Rails tutorial 中的练习由 M. Hartl 着。我已经完成了第 4 章中的所有练习,但仍停留在这一章上: Create three hashes call
我似乎左右都遇到了失败...我检查了我的代码,一切都已定义并且拼写检查正在检查...这是我的失败...: Failures: 1) User pages index should list eac
我正在写关于我在完成 Michael Hartl 的 Ruby on Rails 教程时遇到的问题。问题是 css 不会更改用于密码确认的输入字段的外观。所有其他输入字段的外观都受 css 规则的影响
我正在编写 Michael Hartl 的教程。我在第 6 章。我要进行用户验证。下面的代码是我被告知要使用的代码,但它不起作用。我收到错误消息 syntax error, unexpected en
我一遍又一遍地检查代码,但我似乎找不到下拉菜单不起作用的原因。因此,我看不到下拉菜单中的链接是否正常工作。此外,标题现在切断了 。任何帮助是极大的赞赏。这是我的代码。 _header.html.erb
我是一名优秀的程序员,十分优秀!