【问题标题】:Grails: Securing REST API with OAuth2.0Grails:使用 OAuth2.0 保护 REST API
【发布时间】:2012-06-28 12:57:19
【问题描述】:

我正在使用 Grails 构建一个 REST API。我希望使用 OAuth2.0 client_credentials flow(grant_type) 对其进行保护。我的用例如下:

外部代理会向类似的东西发送请求

http://server-url/oauth/token?client_id=clientId&client_secret=clientSecret&grant_type=client_credentials

并获得一个access_token。然后,我的 URL(受保护的资源)应该可以通过类似的方式访问

http://server-url/resource?access_token={access-token obtained before}

我正在寻找能够在 Grails 上轻松快速地执行此操作的方法。为此使用的最佳方式/工具/插件是什么? Scribe 库是一个选项,如果有针对我的特定用例的任何教程,那就太好了。

P.S.:我已经尝试过 spring-security 和相关插件,那里没有乐趣。任何替代方案都会很好。

【问题讨论】:

  • 抱歉,scribe 目前只是客户端。重新标记这个。

标签: grails oauth-2.0 oauth-provider


【解决方案1】:

这不是一个插件,它只是一个充当 OAuth 提供者的示例 Grails 应用程序。使用 Grails 3 启动和运行真的很容易。

https://github.com/bobbywarner/grails3-oauth2-api

【讨论】:

    【解决方案2】:

    我也有同样的问题。我发现很多 grails 插件可以帮助您针对其他 oauth 提供者验证您的应用程序,但没有任何东西可以帮助我使我的应用程序成为 oauth 提供者。经过大量挖掘,我发现了这个 grails 插件,它可以完全满足您的需求。

    https://github.com/adaptivecomputing/grails-spring-security-oauth2-provider

    我仍在为我的应用程序配置它,我认为文档可能需要一些编辑(特别是授权代码流程),但我得到了简单的 client_credentials 流程以使用最少的配置。希望对您有所帮助!

    【讨论】:

    • 该插件在文档方面确实缺乏,有点被遗弃了。因此,我结束了使用 Spring Roo 而不是 Grails。 Roo 有一个非常好的插件,并且由于 Roo 只是香草 Spring MVC 的重新包装,您可以获得更多官方文档。无论哪种方式,如果 Grails 不是必需的,则其他 SpringSource 系列产品(例如 Spring MVC 或 Roo)可能会为 OAuth 实现做得更好。这只是对任何有兴趣的人的提示。这不应该是一个答案,因此我把它留在了 cmets 中。
    【解决方案3】:

    根据我的经验,Scribe 是为 OAuth 1.0 构建的,对 OAuth 2.0 的支持非常有限。事实上,为了测试我们自己的 OAuth 2 实现,我们可以使用的只是一个 HTTP 请求包装器,我们必须手动执行其他任何操作。幸运的是,手动操作非常简单。

    由于我还没有找到一个很好的 Java 开放 OAuth 2.0 库(坦率地说我不熟悉 Groovy),我鼓励您自己编写客户端代码。您甚至不需要客户端回调端点来使用客户端凭据授予流程。因此,您只需创建一个 HTTP 请求(正如您在上面已经写过的,但请注意转义 GET 参数)并获取响应内容。您的流程不使用重定向,因此只需解析响应内容中的 JSON 对象,例如使用 org.json 库。最后,使用提取的访问令牌发送 HTTP 请求。

    请注意,您的示例并不完全符合标准。该标准要求使用 HTTPS,在 HTTP 标头而不是 GET 参数中发送令牌,并建议使用 HTTP 基本授权标头而不是 GET 参数来指定客户端凭据。

    我可能误解了您的问题,您可能也想实现服务器端。 scribe 库仅支持客户端,因此您可以找到商业实现或实现自己的服务器。这是一项复杂的任务,但如果您只支持客户端凭据流,它几乎变得容易。 ;-)

    【讨论】:

    • 感谢您的意见。但是,我对服务器端的实现很感兴趣。我毫不犹豫地从头开始实施它,因为我不是 OAuth 安全专家,也不想留下任何安全漏洞:P。准确地说,我正在寻找可以帮助我存储/管理生成的访问令牌[在到期后自动使它们失效]等的东西。当然,可以从头开始,但可能会留下一些空白。 Java 是否存在类似的东西,它提供了一个简单的接口来在服务器端生成、存储令牌等?
    • 我不知道这样的库,但是令牌存储是作为具有清晰接口的插件实现的最简单的部分(您只需要存储、加载和撤销操作)。您应该更多地关注实现客户端凭据授予流程和存储客户端凭据的预定义权限的安全细节。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 2014-12-06
    • 2021-02-19
    • 1970-01-01
    • 2019-04-28
    • 2013-11-29
    • 2013-01-26
    • 2014-12-28
    相关资源
    最近更新 更多