要为 Coinbase 创建 ClientRegistration.Builder,我使用以下代码:
ClientRegistration.Builder builder = getBuilder(registrationId,
ClientAuthenticationMethod.CLIENT_SECRET_BASIC, redirectUri)//
.authorizationUri(CB_AUTHORIZATION_URI)//
.tokenUri(CB_TOKEN_URI)//
.userInfoUri(CB_USER_INFO_URI)//
.userNameAttributeName(CB_USER_NAME_ATTRIBUTE_NAME)//
.clientName(CB_CLIENT_NAME);
其中 CB_USER_INFO_URI = "https://api.coinbase.com/v2/user" (请参阅 https://docs.cdp.coinbase.com/sign-in-with-coinbase/docs/sign-in 中的步骤 4 -与 coinbase 集成)。问题是调用不会直接返回用户属性。它将它们包装在另一个映射中,您必须使用该映射中的“data”键才能获取真实的用户属性。另外,我必须临时设置 CB_USER_NAME_ATTRIBUTE_NAME = "data" 才能运行。
不用说,这并不理想,因为用户属性没有正确分配。我该如何解决这个问题?有没有办法让 CB_USER_INFO_URI 直接返回属性?看起来不像。我能想到的唯一其他方法是子类化 DefaultOAuth2UserService ,以便我可以更改两行,然后使用它来定义我的 securityFilterChain ,如下所示:
.userInfoEndpoint(uie -> uie.userService(userService))
有更好的方法吗?我是不是错过了什么?
不,你没有错过任何东西。
根据您链接的文档,Coinbase 符合 OAuth2,但不符合 OIDC => 您必须对用户信息端点进行额外调用(不能使用访问和刷新端点提供的 ID 令牌)。
默认的
OAuth2UserService
在某种程度上是可配置的,但对于用户名和权限映射,它仅限于根级别的声明。由于 Coinbase 将其作为嵌套声明提供,因此您必须编写自己的声明并按照您已经找到的方式配置它。请注意,您可以扩展 DefaultOAuth2UserService
,但不必这样做:您也可以从头开始实现 OAuth2UserService<OAuth2UserRequest, OAuth2User>
,可以选择使用 DefaultOAuth2UserService
作为委托。