OmniAuth提供什么机制来确保安全登录?

Inc*_*982 5 authentication omniauth ruby-on-rails-3

使用omniauth登录策略,将未登录的用户重定向到身份提供者.身份提供商将确保用户登录,然后将用户重定向到回调URL,允许用户使用身份提供商的身份验证登录到第三方站点.此工作流程由Facebook在其图表中解释:

https://developers.facebook.com/docs/user_registration/flows/

如何确保恶意用户不会欺骗此回调,以便他可以访问身份验证用户的第三方帐户?

Mat*_*att 14

与Facebook一样,Google实施OAuth2.0协议以确认身份.我将向您介绍OAuth2.0进程的安全性,OmniAuth如何管理它,并向您展示如何深入了解其实际操作.

由OmniAuth管理的OAuth2.0流程

身份提供者将确保用户被记录,然后将用户重定向到回调URL,允许用户使用身份提供者的身份验证登录到第三方站点.

让我展开:身份提供商将用户重定向到您向该特定身份提供商(即Facebook,Google等)注册您的应用程序时提供的应用程序的回调URL.由于用户已被重定向,因此他们向您的应用程序发送包含授权码的请求(成功登录后由您的身份提供商提供).

如何确保恶意用户不会欺骗此回调,以便他可以访问身份验证用户的第三方帐户?

这就是魔术发生的地方.我们的应用程序从用户那里获取此授权码,将其与我们在注册我们的应用程序时收到的密码相结合,并与身份提供商交换这些密码以获得全能的访问代码.具体来说,以下是确保此回调未被欺骗的步骤:

  1. 整个过程通过SSL(即HTTPS)进行管理.这使得拦截任何这些代码非常困难.
  2. 您的身份提供者通过在成功登录时提供授权代码并在从您的应用程序收到此代码时验证该代码来验证用户的身份.
  3. 您的身份提供商通过验证您的应用程序的密码来确保您的应用程序的身份.

因此,拦截/解密代码将非常困难,如果您尝试使用伪授权代码欺骗重定向,则当您的服务器尝试使用您的标识提供程序验证此代码时,您的登录请求将被拒绝.

看到它在行动

OmniAuth在幕后管理大部分此过程.但是,以下代码应该允许您在操作中看到它:

# Add the following gem to your Gemfile
gem 'httplog', group: :development
Run Code Online (Sandbox Code Playgroud)

我们将使用httplog gem.这实际上会将请求日志转储到我们的log/development.log文件中.我们需要初始化:

# Create a new file: config/initializers/httplog.rb
HttpLog.options[:logger] = Rails.logger if Rails.env.development?
Run Code Online (Sandbox Code Playgroud)

现在为终端中的应用程序启动一个新的Rails服务器:

bundle install
rails s
Run Code Online (Sandbox Code Playgroud)

在新选项卡中,添加开发日志:

tail -f log/development.log
Run Code Online (Sandbox Code Playgroud)

继续打开浏览器并使用您选择的身份提供商登录您的应用程序.打开终端窗口,跟踪开发日志,在用户(Started GET "/auth/google_oauth2/callback?state=1)的回调请求之后,您应该看到如下内容:

[httplog] Connecting: accounts.google.com:443
[httplog] Sending: POST http://accounts.google.com:443/o/oauth2/token
[httplog] Data: client_id=123412341234-1234h1234h1234h1234h.apps.googleusercontent.com&client_secret=12341234123412341234&code=123412341234123412341234&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fyourapp.domain.com%2Fauth%2Fgoogle_oauth2%2Fcallback
....
[httplog] Response:
{
  "access_token" : "123412341234123412341234",
  "token_type" : "Bearer",
  "expires_in" : 3599,
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是您的服务器验证授权码并验证访问令牌.接下来,OmniAuth使用此令牌获取一些用户信息.再往下看,你也应该看到:

[httplog] Connecting: www.googleapis.com:443
[httplog] Sending: GET http://www.googleapis.com:443/plus/v1/people/me/openIdConnect
[httplog] Status: 200
[httplog] Response:
{
  "kind": "plus#personOpenIdConnect",
  "gender": "male",
  "sub": "1234123412341234",
  "name": "Matt",
  "given_name": "Matt",
  ...  
}
Run Code Online (Sandbox Code Playgroud)

这表示OmniAuth使用访问令牌获取您请求的信息.

一个很长的解释,但我希望它有所帮助.在推送到生产之前,请务必禁用或删除httplog gem!

  • 适当的答案.谢谢. (2认同)

rea*_*gan -1

不是“那个人”,但没有什么是完全安全的。话虽如此,OmniAuth 是一种维护良好且广泛使用的机制,适用于许多不同的身份验证策略。至于安全性,您需要确保将 openssl 与 jruby 一起使用,可以在此处查看:https: //github.com/mkdynamic/omniauth-facebook下的Supported Rubies。这应该是您所需要的全部安全性,除非您计划广泛使用您的应用程序。

  • 虽然你是对的,但这个问题显示了恶意使用可能使用的非常特殊且非常简单的欺骗。如果没有机制阻止这种情况,那么omniauth 将非常不安全。我自己也在为同样的问题而苦苦挣扎。根据我在omniauth 上看到的大多数文章,用户似乎只需要发送提供商名称和uid 即可以其他人的身份登录,无需进行黑客攻击。 (3认同)