gpt4 book ai didi

java - 如何从 OAuth2 客户端应用程序中的授权服务器获取作为访问 token 响应一部分的附加信息

转载 作者:行者123 更新时间:2023-12-01 19:18:25 25 4
gpt4 key购买 nike

访问 token 响应

{
"access_token": "fd515395-ab03-4cc5-9ba4-03c42bdfdf189b73",
"token_type": "bearer",
"refresh_token": "176ee948-ebdc-4d51-9768-08aa1dfdd081442",
"expires_in": 10799,
"scope": "user_info",
"instance_url": "https://xxxx.xxx.com/xx-xxx-service"
}

我尝试了以下方法,但没有成功

@RequestMapping("/securedPage")
public String securedPage( Model model, OAuth2AuthenticationToken authToken ) {

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

OAuth2AccessToken accessToken = client.getAccessToken();

System.out.println( accessToken.getTokenValue() );
System.out.println( accessToken.getExpiresAt() );
System.out.println( client.getPrincipalName() );
System.out.println( client.getRefreshToken().getTokenValue() );

// Get "instance_url" here

return "securedPage.html";
}

最佳答案

我发现有 3 种可能的方法来获得结果:

  1. 使用注入(inject)Principal对象。对于 Spring OAuth2,它是通过类 OAuth2Authentication 实现的。您可以在该对象中找到大部分信息 - detailsuserAuthenticationstoredRequest。检查一下,您就会看到您需要的内容。

  2. 直接获取身份验证请求所需的所有参数:

服务方式:

var resourceDetails = ((OAuth2RestTemplate) restTemplate).getResource();
var headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.setBasicAuth(resourceDetails.getClientId(), resourceDetails.getClientSecret());
var form = new LinkedMultiValueMap<String, String>();
form.add("grant_type", "password");
form.add("username", "<username>");
form.add("password", "<password>");
var request = new HttpEntity<>(form, headers);
var response = restTemplate.postForObject(resourceDetails.getAccessTokenUri(), request, LinkedHashMap.class);

对象response包含所有参数,如访问 token 响应中的参数。

有一件事 - 您需要使用特定的 restTemplate ,如下所示:

var resourceDetails = new ClientCredentialsResourceDetails();
resourceDetails.setClientId("<clientId>");
resourceDetails.setClientSecret("<clientSecret>");
resourceDetails.setAccessTokenUri("<accessTokenUri>");
resourceDetails.setScope("<scopes>");
resourceDetails.setAuthenticationScheme(AuthenticationScheme.header);
resourceDetails.setGrantType("client_credentials");
var restTemplate = new OAuth2RestTemplate(resourceDetails, new DefaultOAuth2ClientContext());
var requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setConnectTimeout(10000);
requestFactory.setConnectionRequestTimeout(10000);
requestFactory.setReadTimeout(10000);
restTemplate.setRequestFactory(requestFactory);
var tokenProvider = new ClientCredentialsAccessTokenProvider();
tokenProvider.setRequestFactory(requestFactory);
restTemplate.setAccessTokenProvider(new AccessTokenProviderChain(Arrays.<AccessTokenProvider>asList(
new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(),
new ResourceOwnerPasswordAccessTokenProvider(), tokenProvider)));
  • 在授权服务器上生成一个对象,并使用类似的restTemplate 来响应客户端。这是一种不可取的方法,但也是可以实现的。
  • 关于java - 如何从 OAuth2 客户端应用程序中的授权服务器获取作为访问 token 响应一部分的附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390704/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com