简体   繁体   English

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

[英]How to get additional information which is part of access token response from authorization server in OAuth2 client app

Access token response访问令牌响应

{
    "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"
}

I've tried as below but no luck我试过如下但没有运气

@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";
}

I see 3 possible ways to get the result:我看到了 3 种可能的方法来获得结果:

  1. Using injecting Principal object.使用注入Principal对象。 For Spring OAuth2 it's implemented with class OAuth2Authentication .对于 Spring OAuth2,它是用OAuth2AuthenticationOAuth2Authentication You can find most of the information in this object - in details , userAuthentication , storedRequest .您可以在此对象中找到大部分信息 - detailsuserAuthenticationstoredRequest Inspect it and you will see what you need.检查它,你会看到你需要什么。

  2. Get directly all required parameters with authentication request:通过身份验证请求直接获取所有必需的参数:

Service method:服务方式:

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);

The object response contains all parameters like in your access token response.对象response包含访问令牌响应中的所有参数。

One thing - you need to use a specific restTemplate like next:一件事 - 您需要使用特定的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)));
  1. Generate an object on the Authorization Server and to respond it with a similar restTemplate to the Client.在授权服务器上生成一个对象,并用类似的 restTemplate 向客户端响应它。 This is an undesirable approach but it can be implemented also.这是一种不受欢迎的方法,但也可以实施。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将用户重定向到oauth2授权服务器以获取令牌Spring Boot - Redirecting user to oauth2 authorization server to get token Spring Boot 如何访问 oauth2 访问令牌和用户信息 - How to access oauth2 access token and user information 通过 Web 门户 (OAuth2) 获取访问令牌作为响应 - Get Access Token as a Response through Web Portal (OAuth2) 从Java访问Spring OAuth2授权服务器端点的问题 - Problem with access to Spring OAuth2 authorization server endpoint from java Spring 启动 oauth2:无 userInfo 端点 - 如何直接在客户端从 JWT 访问令牌加载身份验证(主体) - Spring boot oauth2: No userInfo endpoint - How to load the authentication (Principal) from the JWT access token directly in the client Spring 授权服务器 1.0.0:请求 /oauth2/token 时出现 invalid_client 错误 - Spring Authorization Server 1.0.0: invalid_client error while requesting /oauth2/token OAuth2 Google授权:是否可以在不启动(码头)服务器的情况下获取访问令牌 - OAuth2 Google authorization : is it possible getting access Token without starting a (jetty) server 使用 java 从 Oauth2 rest api 获取访问令牌 - Get access token from Oauth2 rest api using java Oauth2从UBER获取access_token - Oauth2 Get access_token from UBER 如何使用Spring配置Oauth2授权服务器? - How to configure a Oauth2 authorization server with Spring?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM