自定义 OAuth2 同意流程

问题描述 投票:0回答:3

我正在构建一个服务提供商应用程序,用户应该能够使用 OAuth2 和 OpenID Connect 与第三方应用程序共享数据。

标准 OAuth2 同意流程授权范围(共享哪些属性/角色)。 但是,由于属性可能包含多个值,因此我们还希望允许用户选择要共享的值。

所以我的问题是,我是否应该将整个 OAuth2 同意流程替换为自定义流程,其中 OAuth2 范围或多或少地替换为显式属性键/值对? 去掉范围这样的 OAuth2 核心组件感觉有点奇怪,你觉得呢?还有其他建议吗?

我目前正在尝试使用 Spring 授权服务器来自定义同意流程(因为我们当前使用的 Keycloak 似乎在同意逻辑方面不太灵活)。

我认为替换 Spring 授权服务器中的标准同意流程需要重写 OAuth2AuthorizationConsentService、OAuth2AuthorizationConsentAuthenticationProvider 以及用于身份验证的所有 OAuth2...AuthenticationProvider 类,以便将同意转发到新的同意流程。

spring-security oauth-2.0 spring-authorization-server
3个回答
1
投票

查看官方自定义同意样本!此示例演示了一个自定义同意屏幕,无需替换用于处理同意屏幕提交并将用户同意保存在

OAuth2AuthorizationConsentService
中的内置组件。

特别是,这些行配置同意页面,并且此控制器端点实现构建自定义同意屏幕的逻辑,该屏幕可以是您的应用程序所需的任何内容。

如果您想要自定义从同意屏幕映射到已保存授权的内容,您可以使用 authorizationRequestConverter() 自定义

OAuth2 授权端点
。范围只是存储为“权限”,因此您可以代替(或另外)存储您想要的任何内容。

要自定义因同意和授权而生成的访问令牌 (JWT),请提供

OAuth2TokenCustomizer<JwtEncodingContext>
,如参考文档中的示例 OAuth2TokenCustomizer 所示。


1
投票

您所描述的是范围的确切目的:包含用户对特定客户端可以代表他们访问哪些数据(属性名称)的同意。通常,为了方便用户选择和软件维护,范围选择中的属性粒度与内部数据模型不同(例如

contact
范围可以代表数据库中的电话、国家、城市、邮政编码和街道列)

由于 Oauth2 和 OpenID 均未指定角色、组、权限或应映射到 Spring 权限的任何内容,因此授权服务器使用私有声明来存储此数据(通常不是范围)。如果你习惯了 Keycloak,你应该注意到角色默认放在

realm_access.roles
resource_access.{client-id}.roles
中。其他授权服务器将使用其他私有声明。

简单地说,角色(或组或权限或任何你想称呼的东西)定义了特定的用户可以在系统中做什么,当范围应包含允许特定的客户端代表该用户访问哪些资源时.


0
投票

我想添加一些有关相关各方的基于用例的注释,以及同意如何发挥作用。

客户

客户端应用程序只需使用范围参数进行重定向。可以发送声明参数,但很少使用。范围可能是

profile
并由
name
date of birth
声明组成。

授权服务器

这会在同意屏幕中显示所请求的信息。最灵活的方法是呈现声明,例如作为复选框。某些声明(例如名称)可能会根据需要进行标记并使用禁用的复选框。其他的,例如出生日期,可以是可选的。用户可以取消选择后一个声明,然后它就不会包含在发行的代币中。

定制同意书

理想情况下不需要定制来实现上述目标,这应该是开箱即用的。但 Spring 的情况可能并非如此。不过,自定义同意是有效的。这样做的一个有趣的例子是在开放银行中,用户可以同意支付运行时金额:

I consent to pay company X £100 for product Y from account Z
© www.soinside.com 2019 - 2024. All rights reserved.