当前位置: 首页 > 知识库问答 >
问题:

如何获得带有Azure Spring Boot的AccessTokenB2C

阎俊英
2023-03-14

再次明确地说,访问是通过Azure B2C进行的。这显然是一个很大的区别,因为有两种不同的方式访问它。

我遵循以下指南:https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc

我以前尝试过其他指南,但这对B2C不起作用:https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory

认证工作正常。我被重定向到登录页面,并在成功登录后返回。用户信息可以从OAuth2AuthenticationToken请求。

在浏览器中,我的应用程序有一个JSESSIONID。

在同一个域中,我想通过Vue直接从应用程序前端使用REST服务。js。

所以我想我应该向前端提供一个AccessToken,它可以用来访问REST API。

我搜索并找到了一个相对简单的例子:https://spring.io/blog/2018/03/06/using-spring-security-5-to-integrate-with-oauth-2-secured-services-such-as-facebook-and-github

但是当我尝试注入OAuth2AuthorizedClient服务时:

@RequestMapping(path = "/user")
public ResponseEntity<User> test(@NonNull final OAuth2AuthenticationToken token,
        @AuthenticationPrincipal(expression = "idToken") final OidcIdToken idToken, final
OAuth2AuthorizedClientService clientService) {
    LOG.debug("GET called on /api/user resource");
    LOG.debug("OidcIdToken: {}", idToken.getTokenValue());

    final OAuth2AuthorizedClient client = clientService
            .loadAuthorizedClient(token.getAuthorizedClientRegistrationId(), token.getName());

    LOG.debug("Access: {}", client.getAccessToken().getTokenValue());

访问时发生以下错误:

java.lang.NoSuchMethodException: org.springframework.security.oauth2.client.OAuth2AuthorizedClientService.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_231]
    at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_231]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]

有人能把我推向正确的方向吗?

使现代化

这是我的错。从指南中我得到的印象是,OAuth2AuthorizedClientService可以通过该方法注入<事实并非如此。只有通过构造函数或直接@inject注入该类时,它才有效。

现在我有了我的访问令牌。。。

共有1个答案

狄赞
2023-03-14

必须将OAuth2AuthorizedClientService注入类中,而不是作为方法参数。见上图。。。

 类似资料:
  • 问题内容: 我尝试了以下代码: 但是我得到的只是一条很宽的线条,从屏幕上划开了。如何获得带有环绕文字的标签? 问题答案: 这与滑块始终具有默认宽度或“滑块始终具有默认宽度”中看到的问题相同。 您需要将该标签放入表格中,并在标签所在的表格单元格中添加正确的大小。 UI窗口小部件未设置其自身的大小和位置。而是由父窗口小部件设置每个子窗口的大小和位置。小部件提供了父级可以用作提示的最小,首选和最大大小。

  • 问题内容: 我想使用Selenium WebDriver 获取选定的标签* 或 下拉列表的 值,然后在 控制台 上 打印 它。 * 我可以从下拉列表中选择任何值,但是我无法检索所选值并进行打印: 但是我所有的努力都是徒劳的。如何获得所选的选项? 问题答案: 您应该能够使用来获取文本(对于使用的option元素):

  • 问题内容: 我想知道实时有多少用户连接到我的应用程序。我想到了要打开的会话数循环的想法,但是我找不到该怎么做的方法。如果您有另一种方法可以提出您的建议。 问题答案: 到目前为止,我发现的最佳解决方案是计算会话的创建和销毁时间。 然后在VaadinServlet init()方法中添加SessionListeners

  • 我有一个名为info的表,其数据如下所示: 我需要获得不同的用户ID数据,以及他们的列的最大完成时间 预期产出为: 我需要使用查询来完成这件事。我如何做到这一点,我使用SQl完成了这件事,需要使用Linq

  • 这在Maven中起作用,但是当我修改类时,IntelliJ给我的注释处理器提供了一个,其中作为单个根元素。 我知道Gradle通过将带有所有与注释匹配的源代码的假传递给注释处理器来支持聚合注释处理器的增量编译,但是IntelliJ似乎没有类似的内容。(也许Gradle项目除外?) 当IntelliJ只编译类时,找到这两个类的最佳方法是什么?

  • 我正在获取一个网页,我需要得到所有元素的列表与给定的类名。问题是,我的数组还包含嵌套元素(从父元素获取),这些元素也具有相同的类名。 示例: 在这种情况下,我将接收5个元素,而不是4个-我想避免得到嵌套的元素。有什么解决方案可以达到我的目的吗?