OpenID Connect 和 OAuth 2.0 三分钟概述
一开始,有一些孤立的网站,彼此之间不进行交流,这很令人难过。
Yelp 等网站开始想要访问您在 Google 通讯录中的联系信息。因此,Yelp 自然会收集您的 Google 用户名和密码,以便它可以访问您的联系人。您已授予 Yelp 许可,所以这一切都很好,是吗?不!
通过您的用户名和密码,Yelp 可以访问您的电子邮件、您的文档——您在 Google 中拥有的一切——而不仅仅是您的联系人。而且,更糟糕的是,Yelp 必须以可以明文使用的方式存储您的密码,并且没有标准方法可以撤销您对 Yelp 访问您的 Google 帐户的同意。
我们需要一个授权框架,允许您在不放弃密码的情况下授予对某些信息的访问权限 - 提示 OAuth。
您可能还喜欢:OAuth 到底是什么?
经过三次修订后,我们迎来了 OAuth 2.0(之前有 1.0 和 1.0a),世界一切都好。现在,像 Yelp (a ) 这样的应用程序 可以从像 Google (an ) 这样的服务 Client Application请求 。Access TokenAuthorization Server
您( Resource Owner)使用您的凭据登录 Google,并将您的凭据提供 Consent给 Yelp 以访问您的联系人(并且仅限您的联系人)。 Access Token在手中,Yelp 向 Google Contacts API (the ) 发出请求 Resource Server并获取您的联系人。Yelp 永远不会看到您的密码,也绝不会访问您同意之外的任何内容。而且,您可以随时撤回您的同意。
在这个同意和授权的新世界中,只缺少一件事:身份。提示 OpenID 连接。OIDC 是 OAuth 2.0 之上的一个薄层,它引入了一种新型令牌:身份令牌。有关经过身份验证的用户的信息以JWT格式编码在这些加密签名令牌中 。这为互操作性和单点登录的新水平打开了大门。
OAuth(以及扩展的 OIDC)使用许多定义 来管理、 和 之间 Flows的交互 。在这篇文章中,您将重点关注 . 此流程应从您的浏览器启动,如下所示:Client AppAuthorization ServerResource ServerAuthorization Code Flow
Yelp 想要访问您的联系人。它提供了一个链接您的 Google 通讯录的按钮。
单击该按钮后,您将被重定向到 Google,并使用您的用户名和密码登录(如果您尚未登录)。
Google 会向您显示一个屏幕,告诉您 Yelp 想要对您的联系人进行只读访问。
一旦您同意,Google 就会通过您的浏览器重定向回 Yelp,并提供一个临时代码(称为授权代码)。
使用此代码,Yelp 联系 Google 以将其交易为访问令牌。
Google 会验证代码,如果全部检查通过,则会向 Yelp 颁发具有有限功能(对您的联系人的只读访问权限)的访问令牌。
然后,Yelp 向 Google Contacts API 提供访问令牌。
Google Contacts API 会验证令牌,如果请求与令牌标识的功能匹配,则将您的联系人列表返回给 Yelp。
OAuth 2.0 和 Spring Boot
Spring 框架已经 诞生 17 年了。Spring 框架及其包含的许多项目(如 Spring Security)非常庞大。
可以公平地说,Spring 及其许多项目的核心引擎是配置。Spring Boot 将“约定优于配置”的概念带入 Spring 世界,以便您可以快速启动并运行可投入生产的应用程序。它通过固执己见的自动配置系统(您可以根据需要覆盖该系统)来实现此目的。
Spring Security正式化了 Spring 框架中的身份验证和授权方法。
OAuth 和 OIDC 非常适合 Spring Security 构造,并且在最新版本的 Spring Boot( 撰写本文时的 版本2.1.3 )和 Spring Security(撰写本文时的版本5.1.4 )中,这些标准现在是第一个级公民。
如果您一直使用 Spring Boot 1.5.x 进行OAuth和 OIDC,则需要做一些迁移工作才能进入 Spring Boot 2.1.x 的新世界,但这是值得的。
在迁移路径中演练的示例代码中,您将与 Okta 的 OAuth 和 OIDC 服务集成。但是,您可以针对任何符合 OAuth 和 OIDC 的提供商遵循本指南。
配置 OpenID 连接
Okta 让您可以轻松地为您的应用程序配置 OIDC 和 OAuth 2.0。您所要做的就是提供一些基本信息,Okta 会完成所有繁重的工作。这是 OaaS!(OAuth 即服务)。
使用 OIDC 和 OAuth 2.0 设置 Okta,以获取 代码中的 Spring Boot 示例。您只需执行一次此配置即可在三个代码示例中的每一个中使用。
首先,创建一个免费的开发人员 Okta 组织。按照说明激活您的组织。
在 Okta 中创建 OIDC 应用程序
单击 ApplicationsOkta 管理 UI 菜单中的。
单击 Add Application并单击该 Web选项。
单击 Next。输入 Name应用程序的 a。将 的值更改为 Login Redirect URIs: http://localhost:8080/login/oauth2/code/okta。添加另一个登录重定向 Uri: http://localhost:8080/login。保留所有其他默认值。
注意:您添加两个不同的登录重定向 uri 以支持不同版本的 Spring Boot。在 2.1.x 版本中,您可以使用: http://localhost:8080/login/oauth2/code/okta.
单击 Done。向下滚动并捕获 Client ID和 Client Secret值。
就是这样!四个步骤。还不错。
玩 Spring Boot OpenID Connect 和 OAuth 2.0 游戏
该 代码示例分为三个 Maven 模块: oauth2-demo-1.5、 oauth2-demo-2.1和 okta-oauth2-demo-2.1。这些是完全封闭的示例,它们之间没有父关系。他们每个人都有适合 spring-boot-starter-parent该示例的版本。这使得 pom.xml文件比必要的更加冗长,但它使得您可以完全独立地运行每个版本的 Client Application和每个版本的 Resource Server。您甚至可以为每个版本使用不同的 JVM 版本。
每个版本的示例代码都有四个主要文件
pom.xml- 识别依赖关系
application.yml- OIDC 和 OAuth 所需的配置
DemoApplication.java- 客户端应用程序
DemoResourceServer.java- 资源服务器
在每种情况下,我都设定了一个目标,即最大限度地减少依赖项、配置和注释来完成工作。此外,应用程序代码、控制器代码和配置代码被人为地包含在单个文件中。这是为了保持示例清晰简洁。在实际应用程序中,您可以将这些关注点分成各自的类。
当您启动 时 DemoApplication,它将监听 http://localhost:8080。当您启动 时 ResourceServer,它将监听 http://localhost:8081。