当前位置: 首页 > 科技观察

使用钩子促进OAth 2.0与OpenID连接_0

时间:2023-03-23 11:52:10 科技观察

使用钩子通过OpenIDConnect促进OAth2.0两个强大的工具。本文将向您展示如何使用Okta的新内联钩子(参见:https://developer.okta.com/docs/reference/api/inline-hooks/)将信息传递给卡片中通过OIDC和OAuth获得的令牌。首先,您将在Okta中设置OIDC应用程序以查看返回的令牌类型。然后,您将配置SpringBootAPI应用程序。通过各种API端点,您可以向Okta注册令牌挂钩并为Okta的令牌补丁请求提供服务。当操作完成时,由于已注册的挂钩,您将在有效负载中找到令牌。在使用本文之前,请提前设置以下内容:通过https://developer.okta.com/signup/创建一个免费的Okta开发者组织。安装HTTPie(https://httpie.org/),它是curl的替代品,用于与API端点交互。安装ngrok(https://ngrok.com/),这是一个允许互联网访问在本地运行的服务器应用程序。可选:在https://signup.heroku.com/创建一个免费的Heroku帐户。接下来,让我们看一下OIDC和OAuth的相关概念。使用OAuth2.0的委派授权让我们想象一个场景,其中Yelp等客户端应用程序从Google等身份验证服务请求访问令牌。您以财产所有者的身份使用自己的凭据登录Google,并同意Yelp仅访问您自己的联系人。所以,Yelp有一个accesstoken,可以通过Google的ContactsAPI请求资源服务器来获取你的联系信息。在此过程中,Yelp绝不会看到您的密码,也绝不会访问超出您同意范围的内容。并且,您可以随时撤回您的同意。使用OpenIDConnect进行标识在这个同意和授权部分,您会注意到它只缺少一件事:身份。我们需要引入一个新的token:identitytoken,通过OAuth2.0之上的一层——OpenIDConnect(OIDC),来验证用户的身份信息,以及JWT(https://developer.okta.com/docs/api/resources/oidc#access-token)格式被编码到加密签名的令牌中。这样既保证了互操作性,又实现了单点登录(SingleSignOn)。OAuth和OIDC扩展使用各种定义的流程(Flows)来管理客户端应用程序、身份验证服务器和资源服务器之间的交互。如下图所示,我们将重点关注浏览器中的授权代码流程:要访问您的联系人,Yelp使用一个按钮链接到您的Google联系人。单击此按钮后,您将被重定向到Google,以使用您的用户名和密码登录。Google通过显示Yelp想要对您的联系人进行只读访问来让您知道。单击同意后,Google会使用临时代码(称为授权代码)通过您的浏览器重定向回Yelp。Yelp使用该代码与谷歌交换访问令牌。完成所有代码验证后,Google会向Yelp发出一个有限的(对您的联系人的只读访问权限)访问令牌。Yelp向GoogleContactsAPI提供访问令牌。GoogleContactsAPI验证令牌,如果Yelp的请求与令牌标识的功能匹配,您的联系人列表将返回给Yelp。为OIDC和OAuth2.0设置OktaOrg下面您将在Okta中创建一个OpenIDConnect应用程序。登录Oktaorg后,您可以根据顶部菜单导航到Applications,单击AddApplication,单击第三个标记为Web的框,然后单击Next。最后点击完成。Heroku上的OIDC为了执行各种可用的流程,我创建了一个OIDC游乐场应用程序。登录到https://okta-oidc-fun.herokuapp.com后,您将看到一个带有表单和一些切换按钮的页面。它默认指向我的Okta组织。当然,您可以通过下面的表格将其更改为您自己的Okta组织。通过向下滚动并单击链接,您可以启动一个新选项卡,您可以在其中使用Okta组织进行身份验证。然后,您将被重定向回ID令牌和访问令牌所在的位置。点击“VerifyIDToken”,您将看到有效载荷已被编码到令牌中。到目前为止,您已经了解了Okta中的OpenIDConnect应用程序如何生成各种令牌。下面,我们将讨论如何创建将自定义声明添加到ID令牌的挂钩。由于这发生在ID令牌被签名之前,您仍然可以安全地验证加密签名。要设置FavoriteBeersAPI,请从GitHub获取此示例的源代码--https://github.com/oktadeveloper/okta-token-hooks-example。这是一个SpringBoot类型的应用程序,它使用OktaSpringBootStarter轻松地与OpenIDConnect和OAuth2.0集成。它使用H2(https://www.h2database.com/html/main.html)内存嵌入式数据库和SpringDataJPA(https://spring.io/projects/spring-data-jpa)来实现简单的对象关系映射和Lombok(https://projectlombok.org/)项目。该应用程序指向您的FavoriteBeersAPI,以及一个处理传入Okta请求并返回ID令牌的挂钩请求。在src/main/resources文件夹中,您将看到application.sample.yml文件。您可以将其生成的application.yml文件复制到同一文件夹中。然后根据上面的设置,自定义application.yml文件的内容,包括issuer、clientId、clientSecret的值。同时,你也可以将id和password的值改成其他任意值。完成这些设置后,您可以使用以下命令运行应用程序:注意:您需要Java11或更高版本才能运行此示例。如果您使用的是Mac,建议您使用SDKMAN(https://sdkman.io/)来管理Java版本。运行Beer应用应用启动后,你会看到如下输出,说明“beer”已经填充到H2内存数据库中。现在您可以使用BeersAPI添加您最喜欢的啤酒。但是,所有API端点均受OIDC保护。请执行以下命令将啤酒添加到收藏夹列表:如果一切顺利,您将得到以下响应:到目前为止,您已经为此应用程序创建了一个新的啤酒条目并将其添加到您的收藏夹文件夹列表中。注意:由于该应用程序使用内存数据库,因此如果您重新启动该应用程序,您将需要使用此API重新添加您最喜欢的啤酒。下面,我们将设置一个内联挂钩,将beers声明添加到它自己的ID令牌中。从ID令牌中获取您最喜欢的啤酒为了利用钩子来处理API,Okta需要能够通过公共互联网调用它。在现实生活中,您会在某处部署您的应用程序并进行设置,以便Okta与其交互。出于此处的演示目的,我们将使用ngrok(https://ngrok.com/)服务发送一个唯一的、可公开寻址的域,以连接到本地运行的SpringBoot应用程序。请在单独的终端上运行以下命令:您将看到以下输出:请复制其https链接(例如:我看到的是https://e3fc9a95.ngrok.io)以备将来使用。设置Okta内联挂钩此时,您的可公开访问的SpringBoot应用程序已设置为接收Okta挂钩请求。不过我们Okta组织还需要做如下准备:首先,需要在Okta上注册inlinetokenhook。在Oktaorg的管理控制台中,请转到Workflow->InlineHooks,单击:AddInlineHook->Token。请在相应的表单中输入以下内容,然后点击“保存”:其中,Authentication字段是Okta用来向hook提供认证的header。身份验证密码是在授权标头中发送的值。注意:请在application.yml文件中找到身份验证密钥值。如果hookid和password值改变了,那么你需要重新计算基本的authstring并在上面的设置中反映那个值。此时,我们已经在我们自己的Okta组织中创建了挂钩。如下图所示,SpringBoot应用程序通过WebSecurityConfiguration.java在挂钩端点上启用了基本身份验证:基本身份验证用于/api/hooks/**端点,OAuth2.0用于其他所有内容。令牌转换内联挂钩的剖析在配置授权服务器以使用挂钩之前,让我们看一下代码的核心。以下代码使用HooksController方法用您最喜欢的啤酒列表制作ID令牌补丁。TokenHookRequest类利用Lombok和一些默认初始化来确保您不会获得NullPointerException。Okta将向控制器发送许多令牌挂钩请求。在这里,我们仅在需要时使用@JsonIgnoreProperties(ignoreUnknown=true)注释。如果您想了解完整的JSON请求示例,请参阅--https://developer.okta.com/docs/reference/token-hook/#sample-json-payload-of-a-request。通过在请求中使用登录值,代码将执行数据库查找以检索与登录关联的人员。这里的Person记录是我们将其添加到最喜欢的啤酒列表时创建的。同时,代码会设置TokenHookResponse来修补IDtoken,通过命令列表访问aoken。其中,最关键的代码行是:它将啤酒名称列表添加到beers语句所附的回复中。这是JSON响应:最后一步是:配置您的授权服务器以使用此挂钩。要将啤酒添加到您的ID令牌,请单击顶部菜单中的API->授权服务器->默认->访问策略,向下滚动并单击“默认策略规则”旁边的铅笔图标。然后您可以从“使用此内联挂钩”菜单中选择“BeersHook”,然后单击“更新规则”。只要在浏览器中输入localhost:4040,就可以看到ngrok的监控界面。如果您回到之前的OIDC游乐场,您可以关闭带有ID令牌和访问令牌的结果选项卡。再次单击playground上的链接和“验证ID令牌”按钮,您将能够看到啤酒声明,以及已添加到您的收藏夹中的任何啤酒。通过切换回ngrok监控选项卡,您可以看到Okta的请求和SpringBoot应用程序的响应。OktaSpringBootStarter使您能够通过几行代码和三个配置属性将SpringBoot应用程序与Okta集成。它不仅使Okta的OpenIDConnect服务兼容,而且还为您提供全面的单点登录体验。也就是说,同一用户可以访问许多不同的OIDC应用程序,每个应用程序都有自己的一套要求和配置。最后,记住:OIDC不能单独运行,它需要运行在OAuth2.0之上。OAuth只专注于授权,而OIDC则增加了识别和验证的服务。原标题:BoostOAuth2.0andOpenIDConnectUsingHooks,作者:MicahSilverman