我有 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 行您可以看到似乎存在身份验证问题。
我是否缺少使这些示例应用程序工作的简单方法?
最佳答案
我发现了两个问题:
access_token
更改为至 oauth_token
在获取访问权限时(POST/oauth/token 请求)。 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 存储库中找到完全可行的代码:
关于ruby-on-rails - OmniAuth 单点登录与设计,invalid_credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205927/