如何在使用 Spring 登录时正确获取 Coinbase OAuth2 用户属性?

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

要为 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))

有更好的方法吗?我是不是错过了什么?

java spring spring-oauth2 coinbase-api
1个回答
0
投票

不,你没有错过任何东西。

根据您链接的文档,Coinbase 符合 OAuth2,但不符合 OIDC => 您必须对用户信息端点进行额外调用(不能使用访问和刷新端点提供的 ID 令牌)。

默认的

OAuth2UserService
在某种程度上是可配置的,但对于用户名和权限映射,它仅限于根级别的声明。由于 Coinbase 将其作为嵌套声明提供,因此您必须编写自己的声明并按照您已经找到的方式配置它。请注意,您可以扩展
DefaultOAuth2UserService
,但不必这样做:您也可以从头开始实现
OAuth2UserService<OAuth2UserRequest, OAuth2User>
,可以选择使用
DefaultOAuth2UserService
作为委托。

© www.soinside.com 2019 - 2024. All rights reserved.