OmniAuth单点登录与Devise,invalid_credentials

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

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

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

App B / C – 客户端 – https://github.com/RobZolkos/sso-devise-omniauth-client

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

我错过了一些简单的方法来使这些示例应用程序工作吗

我发现了两个问题:

  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头传递。

我不知道如何很好地从头部获取令牌(我认为它可以通过设计获取),所以我丑陋的黑客客户端通过这样的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存储库中找到完全可行的代码:

我没有在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. 授予对资源的访问权限

三足流量(人与消费者对提供者)

  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

oauth的合适资源是官方网站 。 对于3脚的例子,你可以在谷歌oauth游乐场