Skip to content

  • 体验新版
    • 正在加载...
  • 登录
  • KnowledgePlanet
  • docdoc
  • Issue
  • #22

doc
doc
  • 项目概览

KnowledgePlanet / doc

通知 1303
Star 822
Fork 117
  • 代码
    • 文件
    • 提交
    • 分支
    • Tags
    • 贡献者
    • 分支图
    • Diff
  • Issue 42
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 0
  • DevOps
    • 流水线
    • 流水线任务
    • 计划
  • Wiki 2
    • Wiki
  • 分析
    • 仓库
    • DevOps
  • 项目成员
  • Pages
doc
doc
  • 项目概览
    • 项目概览
    • 详情
    • 发布
  • 仓库
    • 仓库
    • 文件
    • 提交
    • 分支
    • 标签
    • 贡献者
    • 分支图
    • 比较
  • Issue 42
    • Issue 42
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 0
    • 合并请求 0
  • Pages
  • DevOps
    • DevOps
    • 流水线
    • 流水线任务
    • 计划
  • 分析
    • 分析
    • 仓库分析
    • DevOps
  • Wiki 2
    • Wiki
  • 成员
    • 成员
  • 收起侧边栏
  • 动态
  • 分支图
  • 创建新Issue
  • 流水线任务
  • 提交
  • Issue看板
已关闭
开放中
Opened 7月 07, 2023 by 小傅哥@Yao__Shun__Yu⛹Owner

oauth2客户端方式获取token以及认证的案例

以下是一个使用Java的示例代码,用于通过OAuth2客户端方式获取token和进行认证:

import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.core.user.OAuth2UserAuthority;
import org.springframework.security.oauth2.core.user.OAuth2UserRequest;
import org.springframework.security.oauth2.core.user.OAuth2UserRequestEntityConverter;
import org.springframework.security.oauth2.core.user.OAuth2UserRequestFactory;
import org.springframework.security.oauth2.core.user.OAuth2UserRequestFactoryProvider;
import org.springframework.security.oauth2.core.user.OAuth2UserRequestResolver;
import org.springframework.security.oauth2.core.user.OAuth2UserService;
import org.springframework.security.oauth2.core.user.OAuth2UserServiceException;
import org.springframework.security.oauth2.core.user.OAuth2UserToken;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenRepository;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenServices;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenServicesProvider;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidator;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorFactory;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorProvider;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorResolver;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenType;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenTypeResolver;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidator;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorFactory;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorProvider;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorResolver;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenType;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidator;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorFactory;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorProvider;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenValidatorResolver;
import org.springframework.security.oauth2.core.user.OAuth2UserTokenType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;
import java.util.Map;
import java.util.Optional;

@Service
public class OAuth2ClientService {

    private final ClientRegistrationRepository clientRegistrationRepository;
    private final OAuth2AuthorizedClientService authorizedClientService;
    private final OAuth2UserTokenServices userTokenServices;
    private final OAuth2UserService userService;
    private final OAuth2UserRequestFactoryProvider requestFactoryProvider;
    private final OAuth2UserRequestResolver requestResolver;
    private final OAuth2UserTokenValidatorResolver validatorResolver;
    private final OAuth2UserTokenTypeResolver tokenTypeResolver;

    public OAuth2ClientService(ClientRegistrationRepository clientRegistrationRepository,
                               OAuth2AuthorizedClientService authorizedClientService,
                               OAuth2UserTokenServices userTokenServices,
                               OAuth2UserService userService,
                               OAuth2UserRequestFactoryProvider requestFactoryProvider,
                               OAuth2UserRequestResolver requestResolver,
                               OAuth2UserTokenValidatorResolver validatorResolver,
                               OAuth2UserTokenTypeResolver tokenTypeResolver) {
        this.clientRegistrationRepository = clientRegistrationRepository;
        this.authorizedClientService = authorizedClientService;
        this.userTokenServices = userTokenServices;
        this.userService = userService;
        this.requestFactoryProvider = requestFactoryProvider;
        this.requestResolver = requestResolver;
        this.validatorResolver = validatorResolver;
        this.tokenTypeResolver = tokenTypeResolver;
    }

    public OAuth2AccessToken getToken(String clientRegistrationId, String code, String redirectUri) {
        ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId(clientRegistrationId);
        OAuth2UserRequestFactory requestFactory = requestFactoryProvider.getFactory(clientRegistration);
        OAuth2UserRequest request = requestResolver.resolve(requestFactory, clientRegistration, redirectUri, code);
        OAuth2AccessToken token = request.getAccessToken();
        OAuth2UserTokenValidator validator = validatorResolver.resolve(request.getTokenType());
        validator.validate(token);
        userTokenServices.saveToken(request.getTokenType(), request.getClientRegistration(), request.getPrincipalName(), token);
        return token;
    }

    public Optional<OAuth2User> getUser(String clientRegistrationId, String accessToken) {
        ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId(clientRegistrationId);
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add((request, body, execution) -> {
            request.getHeaders().setBearerAuth(accessToken);
            return execution.execute(request, body);
        });
        OAuth2User user;
        try {
            user = userService.loadUser(new OAuth2UserRequest(clientRegistration, accessToken));
        } catch (OAuth2AuthenticationException e) {
            return Optional.empty();
        }
        OAuth2UserToken token = new OAuth2UserToken(OAuth2UserTokenType.ACCESS_TOKEN, clientRegistration, user.getName(), accessToken, Collections.emptyMap());
        userTokenServices.saveToken(token);
        return Optional.of(user);
    }

    public Optional<OAuth2AuthorizedClient> getAuthorizedClient(String clientRegistrationId, String principalName) {
        return Optional.ofNullable(authorizedClientService.loadAuthorizedClient(clientRegistrationId, principalName));
    }

    public void saveAuthorizedClient(OAuth2AuthorizedClient authorizedClient, OAuth2User user) {
        authorizedClientService.saveAuthorizedClient(authorizedClient, user);
    }

    public void removeAuthorizedClient(String clientRegistrationId, String principalName) {
        authorizedClientService.removeAuthorizedClient(clientRegistrationId, principalName);
    }

    public void removeToken(OAuth2UserToken token) {
        userTokenServices.removeToken(token);
    }

    public Map<String, Object> getUserInfo(String clientRegistrationId, String accessToken) {
        ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId(clientRegistrationId);
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add((request, body, execution) -> {
            request.getHeaders().setBearerAuth(accessToken);
            return execution.execute(request, body);
        });
        return restTemplate.getForObject(clientRegistration.getProviderDetails().getUserInfoEndpoint().getUri(), Map.class);
    }

    public String getClientId(String clientRegistrationId) {
        return clientRegistrationRepository.findByRegistrationId(clientRegistrationId).getClientId();
    }
}

这个示例代码使用了Spring Security OAuth2库,并提供了一些方法来获取token、认证用户、获取已授权的客户端、保存已授权的客户端等。

在使用时,需要在应用程序中配置OAuth2客户端注册表,以便客户端可以使用它来获取token。您还需要提供一个授权端点和一个用户信息端点,在这些端点上,客户端可以使用token来访问受保护的资源。

Edited 7月 07, 2023 by 小傅哥
指派人
分配到
无
里程碑
无
分配里程碑
工时统计
无
截止日期
无
标识: KnowledgePlanet/doc#22
渝ICP备2023009037号

京公网安备11010502055752号

网络110报警服务 Powered by GitLab CE v13.7
开源知识
Git 入门 Pro Git 电子书 在线学 Git
Markdown 基础入门 IT 技术知识开源图谱
帮助
使用手册 反馈建议 博客
《GitCode 隐私声明》 《GitCode 服务条款》 关于GitCode
Powered by GitLab CE v13.7