ruby-on-rails - OmniAuth 单点登录与设计,invalid_credentials

标签 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 组合解决方案。 .

我已经 fork 并更新到 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 .提供程序似乎通过了 Action ,但是在日志的第 26 行您可以看到似乎存在身份验证问题。

我是否缺少使这些示例应用程序工作的简单方法?

最佳答案

我发现了两个问题:

  • 由于 0.2.1 版本 omniauth 已将身份验证参数名称从 access_token 更改为至 oauth_token在获取访问权限时(POST/oauth/token 请求)。
  • 从 0.3.0 版本开始 omniauth 更改了传递方法 oauth_token在身份验证请求 (GET/auth/josh_id/user.json) 中。之前的 0.3.0 token 已通过请求参数 oauth_token 传递,但从 0.3.0 开始,它通过 HTTP_AUTHORIZATION header 传递。

  • 我不知道如何很好地从 header 中获取 token (我认为它可以通过设计获取),所以我丑陋的黑客客户端通过这样的 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 存储库中找到完全可行的代码:
  • https://github.com/openteam/sso-devise-omniauth-client
  • https://github.com/openteam/sso-devise-omniauth-provider
  • 关于ruby-on-rails - OmniAuth 单点登录与设计,invalid_credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205927/

    相关文章:

    node.js - 使用 ldap.js 的 Active Directory 身份验证

    php如何在 session 超时时执行函数

    ruby-on-rails - 反编译开发 Assets 管道

    ruby-on-rails - 尝试通过 accepts_nested_attributes_for 查找或创建?

    ruby-on-rails - 在现有 Rails 应用程序中创建 JSON API

    css - 带有 wicked-pdf 的背景图片(水印)

    ruby-on-rails - 在 Ruby 中更改文件的权限

    java https登录和浏览

    jquery - Rails 3.1 CoffeeScript/JQuery - 如何更改 div 中图像的来源?

    css - link_to 中的 rails 打印样式颜色