这是哪种类型的列表,我如何访问 tokenValue?

Posted

技术标签:

【中文标题】这是哪种类型的列表,我如何访问 tokenValue?【英文标题】:Which type of list is this and how can I access tokenValue? 【发布时间】:2021-12-03 10:53:18 【问题描述】:

我必须实现一个 OAuth 客户端,并且在访问 JWT 令牌以进一步向 OAuth 服务器请求时遇到了一些困难。

我已经在调试器中找到了它(它位于变量 principal 中的某个位置,可以访问 - 我需要访问 principalidTokentokenValue),但我不知道是哪个这是列表的类型以及如何将其内容存储在变量中?

令人困惑的是,principal 也有一些内容 (String)。但它似乎也是某种列表,可以扩展,还有更多元素由Strings 索引。

函数,我正在尝试访问令牌(最后的注释行不起作用):

// calling Google Calendar API
@GetMapping("/api_request")
public Map<String, Object> getCalendars(@AuthenticationPrincipal OAuth2User principal) 
    // JWT is saved as String in principal→idToken→tokenValue
    String uri = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
    RestTemplate restTemplate = new RestTemplate();
    return Collections.singletonMap("response",restTemplate.getForObject(uri, String.class));
    //  return Collections.singletonMap("principal",principal.getAttribute("idToken"));

在这里你可以看到调试器内部的结构:

【问题讨论】:

【参考方案1】:

好的,这个问题有点令人困惑,但我会尽力回答。

首先,你有方法返回类型 Map,一个 map 是一个集合接口,它有多个实现,更多关于 map 在这里:https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

其次,由于您有一个方法返回类型为映射,因此您在逻辑上返回一个映射,返回 Collections.singletonMap(key, val),在您的情况下,它是一个映射,其中一个条目具有“响应”作为键,并且从 rest 调用返回的任何字符串响应:restTemplate.getForObject(uri, String.class)。

第三,您的委托人有一个 DefaultOidcUser 实现类,它具有获取委托人令牌的方法,例如:public OidcIdToken getIdToken(),更多信息在这里:https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/oauth2/core/oidc/user/DefaultOidcUser.html

希望这能解决一些问题, 干杯。

【讨论】:

以上是关于这是哪种类型的列表,我如何访问 tokenValue?的主要内容,如果未能解决你的问题,请参考以下文章

ACL访问控制列表——标准IP访问列表(理论+实验)

哪种列表/集合类型最适合在 WCF 数据协定中使用?

哪种列类型支持sqlalchemy中的列表?

使用哪种授权类型来验证第三方客户端的 API 访问权限?

我可以从 Qt 应用程序访问哪种类型的 WinRT API?

我应该在CallBimlScript的参数声明中使用哪种数据类型作为字符串值列表?