
你可以使用 OAuth 来保护应用程序、API和设备。OAuth已经变得越来越流行,特别是当开发人员被要求在企业环境中编织数百个应用程序和成千上万的用户时。
Java生态系统非常庞大,全球有超过1000万名开发者,有大量的 IDE 、构建工具、库和框架可以让他们更有生产力。下面的信息图被推荐作为 Java 开发者的一个起点。它旨在帮助指导你的学习,在你的经验增长的同时增加你自己的软件组件。
点击图片可以放大。
[

今天,我将为你提供一个Java中的OAuth生态系统的状态。你将了解哪些框架支持OAuth,哪些不支持。我还将提供一些实际的例子,你可以在短短几分钟内运行。
目录
- OAuth到底是什么?
- 没有浏览器也能进行OAuth吗?
- Java的OAuth 2.0支持Java框架中的OAuthMicroProfile JWT认证Micronaut淘宝网
- 观看Java框架中的 OAuth 2.0 操作
- 不支持OAuth的Java网络框架
- Java安全框架Apache Shiro淘宝网淘宝网
- OAuth 2.0授权服务器
- 那 JavaFX 呢?
- Scala 和 Kotlin 支持OAuth吗?
- 了解更多关于Java和OAuth的信息
OAuth到底是什么?
OAuth是 Open Authorization 的缩写。它是一个开放的标准,任何人都可以实现。更具体地说,OAuth是一个标准,应用程序可以用它来为客户端应用程序提供 “安全的委托访问”。OAuth通过 HTTPS 工作,用访问令牌而不是凭证授权设备、API、服务器和应用程序。
在过去(2006年),网站曾经提示用户提供他们的 Gmail 凭证,以便他们可以邀请他们的联系人使用该网站。用户经常提供凭证,但没有证据表明网站没有存储这些凭证供以后使用。开发OAuth是为了让用户不必提供凭证。相反,用户提供一个来自可信身份提供者的访问令牌。
你可以把OAuth想成是酒店的钥匙卡,不过是针对应用程序。如果你有一张酒店的钥匙卡,你就可以进入你的房间。
你如何获得酒店的钥匙卡?你必须在前台做一个认证过程,才能得到它。经过认证并获得钥匙卡后,你可以访问整个酒店的其他资源。

OAuth 2.0不是一个认证协议。
OpenID Connect(又名OIDC) 是 一个认证协议。我将在另一篇文章中介绍这个问题。
OAuth 2.0有许多流程,而OAuth 2.1是一个正在进行中的努力,为开发者整合和简化最佳流程。简而言之,OAuth 2.0的授权代码流需要证明代码交换(PKCE),隐含的和密码的凭证流被删除。
|
你可以通过阅读Use PKCE with OAuth 2.0 and Spring Boot for Better Security了解更多关于PKCE的信息。 |
如果你想玩玩OAuth 2.0的流程,你可以试试OAuth 2.0游乐场(由Aaron Parecki建立)。
[

没有浏览器也能做OAuth吗?
开发人员经常想,有没有可能 在没有 浏览器的情况 下 进行OAuth流程?简短的回答是 不能 。
浏览器是必需的。浏览器不需要在同一个设备上。如果有用户参与,基本上有三种选择。
- 网络应用程序:处理重定向
- CLI 、TV等:使用设备授权(另一个设备上的浏览器),应用程序使用 REST
- 本地应用:使用自定义的URL处理程序
Java的OAuth 2.0支持
Java这种语言并没有内置的OAuth支持。事实上, JDK 甚至不包含编写网络应用的API。构建网络应用的基本构件是由 Servlet API和Jakarta EE提供的。
Servlet规范有一个安全部分,但其中没有OAuth。Jakara Security 3.0(在撰写本文时仍在开发中)确实提到OpenID Connect和OAuth 没有 进入规范。对我来说,Java的 “企业版 “不支持委托授权或联合身份,这似乎很奇怪。希望我们能作为一个社区,在未来解决这个问题。
好的一面是,Java 18确实包含了一个 jwebserver ,你可以用它来提供静态文件。这就是你在JDK中能找到的所有 “网络 “了。
Java框架中的OAuth
当SAML在2005年首次被发明时,Java网络框架正经历着它们的流行高峰。当时有 上百个 Java Web框架,开发人员会像2000年代末对JavaScript框架那样嘲笑这种财富的尴尬。

这张网络框架的历史年表是由@mraible 在 GitHub 上维护的。
大多数 Java Web 框架支持某种形式的MVC,还有一些是基于组件的。所有这些框架都在服务器端呈现其用户界面。
快进到2022年,Java主要用于API,而JavaScript则通常用于UI。
– Matt Raible
OAuth的关键模式之一是 资源服务器 。一个资源服务器接受一个访问令牌。如果该令牌是有效的,它可以让客户访问资源所有者的数据。在这个例子中,客户端是一个应用程序,资源所有者是一个用户,而资源服务器是你开发的 Java API 。
在下面的章节中,我将向你展示如何使用OAuth,并通过最流行的Java框架设置资源服务器。你可能认为Spring Boot是事实上的标准,你应该只使用它。然而,其他地方也有很多创新,我认为了解其他选择是很好的。
MicroProfile JWT认证
当Java EE在2010年代初停滞不前时,Java EE社区也是如此,最终在2015年创建了MicroProfile。MicroProfile是一项基于标准的努力,将Java EE中可用于创建微服务架构的部分分组。
作为MicroProfile的一部分,有一个JWT Auth规范。尽管它没有提到OAuth,但它是实现OAuth 2.0资源服务器的一个非常可行的方法。
假设你正在使用一个支持MicroProfile的Java框架。在这种情况下,你可以添加框架的JWT认证依赖,加上几个属性来定义发行人和JWKS(JSON Web Token Key Signatures)的位置。这些密钥名称是标准化的,可以在Helidon和Quarkus等框架中使用。
mp.jwt.verify.issuer= Okta .com/oauth2/default
mp.jwt.verify.publickey.location=
复制代码
这种配置让我感到恼火的是, issuer 是一个OpenID Connect概念,它允许你找到一个身份提供者的所有端点,包括JWKS密钥的位置。如果你进入 ${issuer}/.well-known/openid-configuration ,它在 jwks_uri 值中有公钥的位置!

我真希望MicroProfile能让开发者更容易些,这样你就只需要指定发行者。
好消息是你应该能够从另一个属性中引用一个属性。
mp.jwt.verify.issuer=
mp.jwt.verify.publickey.location=${mp.jwt.verify.issuer}/v1/keys
复制代码
Quarkus
如果你想在Quarkus中使用MicroProfile JWT认证,你需要添加上面的属性和一个依赖关系。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
复制代码
Helidon
Helidon与Quarkus非常相似。唯一的区别是它的依赖关系的坐标。
<dependency>
<groupId>io.helidon.microprofile.jwt</groupId>
<artifactId>helidon-microprofile-jwt-auth</artifactId>
</dependency>
复制代码
我已经提到了Helidon和Quarkus。那么其他流行的Java API框架呢?
Micronaut
Micronaut支持OAuth,并有很好的文档说明如何用Okta、 Google 和GitHub等IdPs配置它。
Micronaut需要比MicroProfile多出许多行的配置,但这主要是 YAML 的错。你需要花11行来配置一个OAuth 2.0资源服务器。
micronaut:
security:
enabled: true
token:
jwt:
enabled: true
claims-validators:
issuer: okta .com/oauth2/default
signatures:
jwks:
okta:
url:
复制代码
正如你所看到的,Micronaut还要求你指定JWKS的位置,尽管它可以从发行者那里查到: :shakes-fist:
Spring Boot
Spring Boot默认使用 Spring Security,它是唯一允许你用一行代码配置资源服务器的框架。
spring.security.oauth2.resourceserver.jwt.issuer-uri=
复制代码
当然,你可以用YAML代替。这将是一个糟糕的人生选择。那么它就需要六行代码。 Spring Security 很聪明,可以从发行者那里查找JWKS的位置。
公平地说,Spring Security确实需要一些Java代码来完成配置,而其他的则是自动完成一切。
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityWeb Filter Chain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorize request s( Request -> request.anyRequest().authenticated())
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
return http.build();
}
}
复制代码
|
如果你使用Okta Spring Boot Starter,你不需要用Java配置。我们已经为你包括了这个配置。 |
从这些信息中,我希望你对Java在OAuth方面的情况有一个像样的概述。