gpt4 book ai didi

ruby-on-rails - 如何使用可选的 omniauth token 作为身份验证 token 来设计 http 身份验证

转载 作者:行者123 更新时间:2023-11-30 05:19:54 26 4
gpt4 key购买 nike

我们有一个 Rails 应用程序设置,它使用 devise 和 omniauth 允许通过 facebook 身份验证登录。我们还有一个移动应用程序,目前正在使用 http 身份验证通过传递用户名和密码或传递 http 身份验证 token 来登录 Rails 应用程序。到目前为止,这一切都很好。

移动应用程序还能够通过 facebook 本身进行身份验证,并直接在其自身和 facebook 之间接收用户 facebook token 。

我想弥合这一差距,以便如果用户通过 facebook 从移动应用程序登录并拥有他们的 facebook token ,则允许该 facebook token 用作 rails 应用程序上的身份验证,就好像他们已经收到它一样通过浏览器从 Facebook。

最终结果是移动应用程序可以通过以下方式让用户登录:

1) 用户名​​/密码或者2)http认证 token 或者3)omniauth( Facebook ) token

此外,在 3) 的情况下,如果用户在 Rails 应用程序中尚不存在,则需要创建用户 - 现在已经通过浏览器端身份验证创建用户,因此可能没有什么可做的了。

我怎样才能在设计结构中最好地实现这一目标?

最佳答案

只是这样做了,但从未见过端到端的解决方案。

这解决了第 3 点。第 1 点和第 2 点很容易通过设计实现并在其他地方记录。

将 FB 身份验证添加到您的 Web 应用程序并不难,关于 omniauth 和 omniauth-facebook 的说明在 github 上。

我相信以下是独立的,如果你想那样做的话,没有做 omniauth-facebook 集成。这类似于其他方法。我的想法是尝试尽可能接近地使用设计模型。

您需要 fb_graph gem。

在移动客户端上,您通过 FB 进行适当的身份验证,并将返回的访问 token 放入您的 http 请求的 header 中。我使用了标题 fb_access_token。 就像基本身份验证一样,您需要通过 SSL 发送它以避免 token 的嗅探。使用 header 允许我在不更改请求的情况下交换基本身份验证和 FB 身份验证,但您可以使用如果您愿意,可以使用参数。

此解决方案实现了一个基于设计可验证看守策略的看守策略。这里的不同之处在于,该策略使用名为 fb_access_token 的 HTTP header ,其中包含使用移动应用程序检索的 facebook 访问 token 字符串。

一旦了解了这一点,代码就非常简单了。

在文件中的 config/initializers 目录中,添加以下内容。我碰巧调用了我的 fb_api_strategy.rb:

# authentication strategy to support API authentication over the webservice
# via facebook

require 'devise/strategies/database_authenticatable'
require 'fb_graph'
require 'warden'

module Devise
module Strategies
class FbMobileDatabaseAuthenticatable < Authenticatable
def valid?
# if we have headers with the facebook access key
!!request.headers["fb_access_token"]
end

def authenticate!
token = request.headers["fb_access_token"]
fbuser = FbGraph::User.me(token)
fbuser = fbuser.fetch

user = User.find_for_facebook_mobile_client(fbuser.email)

# this either creates a new user for the valid FB account, or attaches
# this session to an existing user that has the same email as the FB account

if !!user && validate(user) { true }
user.after_database_authentication
success!(user)
elsif !halted? || !user
fail(:invalid)
end
end
end
end
end

Warden::Strategies.add(:fb_database_authenticatable,
Devise::Strategies::FbMobileDatabaseAuthenticatable)

在 config/initializers 中,将以下内容添加到 devise.rb:

  config.warden do |manager|
manager.default_strategies(:scope => :user).unshift :fb_database_authenticatable
end

要允许您根据 FB 电子邮件创建用户或查找现有用户,请将以下内容添加到您的用户模型:

  def self.find_for_facebook_mobile_client(fb_email)
if user = User.where(:email => fb_email).first
user
else
User.create!(:email => fb_email, :password => Devise.friendly_token[0,20])
end
end

我不认为 fb_database_authenticatable 是一个准确的名称,但我会把它留给读者作为练习。另一个练习是缓存/存储 FB 访问 token ,并可能避免在每次调用时将 RT 发送到 FB。您应该注意,如果您在双方都进行 FB 身份验证,那么来自移动应用程序和 Rails 应用程序的访问 token 将有所不同,我怀疑大多数人都想这样做。这可能会影响您的缓存方案。

我认为这样做 - 快乐编码。

关于ruby-on-rails - 如何使用可选的 omniauth token 作为身份验证 token 来设计 http 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com