OmniAuth单点登录与Devise,invalid_credentials

时间:2011-11-21 00:13:49

标签: ruby-on-rails authentication ruby-on-rails-3.1 omniauth oauth-2.0

我有3个网络应用程序 - A,B和C.应用程序A包含用户数据库。如果访问App B和App C,我希望将用户重定向到App A进行身份验证,然后返回到他们尝试访问的任何应用程序。同时,他们应该登录到所有应用程序。除非有人有更好的解决方案,否则我已经使用了this blog post中描述的OmniAuth / Devise组合解决方案。

我已经分发并更新到Rais 3.1.2示例应用程序A和示例应用程序B / C.

应用A - 提供商 - https://github.com/RobZolkos/sso-devise-omniauth-provider

应用程序B / C - 客户端 - https://github.com/RobZolkos/sso-devise-omniauth-client

这些示例应用程序正常运行,我将被重定向到提供程序应用程序进行身份验证,但它似乎无法进行身份验证。我附上了日志here。提供商似乎经历了这些动作,但是在日志的第26行,您可以看到似乎存在身份验证问题。

我是否遗漏了使这些示例应用程序有效的简单方法?

2 个答案:

答案 0 :(得分:2)

我发现了两个问题:

  1. 由于0.2.1版本omniauth在获取访问权限(POST / oauth / token请求)时已将auth参数名称从access_token更改为oauth_token
  2. 由于0.3.0版本omniauth已更改了在auth请求中传递oauth_token的方法(GET /auth/josh_id/user.json)。先前的0.3.0令牌已通过请求参数oauth_token传递,但自0.3.0以来它通过HTTP_AUTHORIZATION标头传递。
  3. 我不知道如何很好地从头部获取令牌(我认为它可以通过设计获取),所以我丑陋的黑客攻击客户端通过这样的GET参数发送oauth_token(在lib / josh_id.rb中):

    def raw_info
      @raw_info ||= access_token.get("/auth/josh_id/user.json?oauth_token=#{access_token.token}").parsed
    end
    

    您可以在我们的github存储库中找到完全可行的代码:

答案 1 :(得分:1)

我没有在rails中使用oauth的经验,但我将解释我用Java创建自己的提供程序的流程。在轨道上应用它应该很容易。如果您将Devise与omniauth一起使用,则需要了解它们如何提供OAuth支持以及版本。

基本

  • 消费者登录应用,获得consumer_keyconsumer_secret。这是通过常规表单完成的,通常是在开发人员帐户上。
  • (可选)提供商批准创建的帐户

  • 所有OAuth请求都取决于请求中的正确OAuth标头。正确的标题意味着:

    1. 所有oauth属性及其值都按字母顺序排序
    2. 提供了针对特定消费者请求的所有活动密钥/令牌。
    3. 使用所有相关机密签署请求。提供者和消费者都知道秘密,但不包括在标题中。
    4. 提供商生成相同的签名。如果是,则该请求有效。随机数可用于防止重放攻击。

双腿流程(消费者与提供者)

  1. 消费者请求资源,提供consumer_key。
  2. 提供商根据consumer_key和consumer_secret
  3. 检查签名
  4. 授予对资源的访问权
  5. 三条腿流程(人与消费者对提供者)

    1. 提供其consumer_key的消费者请求资源
    2. 消费者从提供商处获得未签名的oauth_token和oauth_token_secret
    3. 用户(提供商处拥有用户帐户的人员)登录提供商以授权提供oauth_request_token和consumer_key的oauth_token
    4. 消费者有一个授权的request_token
    5. Consumer使用request_token请求提供oauth_request_token和consumer_key的access_token
    6. Provider为特定资源提供access_token和access_token_secret
    7. 消费者使用access_token做某事
    8. 提供商在一段时间后无效access_token
    9. 消费者再次使用request_token获取新的access_token(如果已过期)
    10. oauth的合适资源是official site。 对于3脚的示例,您可以访问google oauth playground