将Oauth 2.0添加到基于Jersey的RESTful服务器 - java

我有一个要使用Jersey保护的基于OAuth 2.0的服务器。我看过两种常见的路径:

Oltu-与Jersey兼容,尽管不受Spring Security的支持,但似乎受支持。 This 2012 question似乎暗示这是要走的路,但是我想在2016年的背景下进行确认,所以我不会再实施一些不太受支持的事情。
Spring Security-似乎非常流行,但是此路径意味着将服务器更改为基于Spring的MVC。基于使用像Spring这样广泛支持的内容的好处以及重构的成本,我不知道这是否值得推荐。

在支持下,我的意思是一个持续发展的项目,具有完善的社区,其中包含教程,材料和一些用于客户端(Web,移动,服务器)的库。

哪一个是更强大的选择?还有其他选择吗?

任何状况之下。是否有良好的参考资料或教程来开始实现这一目标?

更新

经过数小时的阅读和了解,我已经提到了两个OAuth Provider,我觉得Apache Oltu的documentation并没有为我提供太多指导,因为尚有未记录的关键组件,但是example给了我更好的印象关于如何实现Oltu的信息。另一方面,通过Spring Security's material,我知道它仍然可以在基于非Spring MVC的java项目上构建。但是在非基于Spring的项目上,Spring Security的实现/教程的公开范围有限。

另一种方法:

我想出了一种架构,该架构可能更稳定并且不关心内部服务器(已经使用Jersey实施的内部服务器)的实现细节。中间有一个专门用于安全性目的服务器(授权,身份验证,将令牌存储在其自己的数据库中等),它充当外部世界和内部服务器之间的网关。它实质上充当中继并来回路由呼叫,并确保客户端对内部服务器一无所知,并且两个实体仅与安全服务器通信。我认为这将是前进的道路

替换为另一安全提供程序仅意味着插入安全服务器实现并添加新的实现。
安全服务器不关心内部服务器的实现,并且调用仍将遵循RESTful标准。

感谢您对这种方法的建议或反馈。

参考方案

Apache Oltu支持OpenID Connect,但其体系结构很差。例如,OpenIdConnectResponse不应是OAuthAccessTokenResponse的后代,因为OpenID Connect响应并不总是包含访问令牌。此外,该库怪异地包含一个特定于GitHub的类GitHubTokenResponse

Spring Security很有名,但恐怕它将永远无法支持OpenID Connect。有关获得OpenID Connect支持的最大障碍,请参见Issue 619。

java-oauth-server和java-resource-server是Jersey + OAuth 2.0的很好的示例,但是它们使用商业后端服务Authlete。 (我是他们的作者。)

OpenAM Foundation的Libraries, Products, and Tools页中列出了OpenAM,MITREid Connect,Gluu,Connect2id和其他OAuth 2.0 + OpenID Connect解决方案。

UPDATE以更新问题

RFC 6749(OAuth 2.0授权框架)将授权服务器与资源服务器区分开。简而言之,授权服务器是发出访问令牌的服务器,而资源服务器是响应随访问令牌而来的请求的服务器。

对于资源服务器,API网关是最近的设计模式之一。亚马逊,CA Technologies,IBM,Oracle和其他公司提供API网关解决方案。 API网关体系结构可能与您的想法很接近。一些API Gateway解决方案以自己的方式验证访问令牌(因为该解决方案是自己发行访问令牌),而其他解决方案只是将访问令牌验证委托给外部服务器(因为这些解决方案没有发出访问令牌的机制)。例如,Amazon API Gateway是将访问令牌验证委派给外部服务器的示例,该外部服务器由Amazon命名为自定义授权者。有关自定义授权者的更多信息,请参见以下内容。

Introducing custom authorizers in Amazon API Gateway(AWS博客)
Enable Amazon API Gateway Custom Authorization(AWS文档)
Amazon API Gateway Custom Authorizer + OAuth(权威文章)

如果授权服务器提供了可以使用有关访问令牌的查询信息的自省API(例如RFC 7662),则您的资源服务器实现可能能够替换(插入和添加)授权服务器以相对容易地进行引用。 。

对于Athorization服务器,网关式解决方案很少见。因为这样的解决方案必须公开将授权服务器实现为Web API所需的所有功能。 Authlete是这样的解决方案,但我不认识其他人。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…