package com.mzl.flower.service.login; import cn.hutool.core.map.MapUtil; import com.mzl.flower.config.OAuth2Properties; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.AuthUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.provider.*; import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Base64; import java.util.List; @Service @Transactional @Slf4j public class LoginService { private static final String BASIC_ = "Basic "; private static final String DEFAULT_CLIENT_TYPE = "default"; @Autowired private AuthorizationServerTokenServices authorizationServerTokenServices; @Autowired private ClientDetailsService clientDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Autowired private OAuth2Properties oAuth2Properties; private String clientAuthorization(String clientType){ if(StringUtils.isBlank(clientType)){ clientType = DEFAULT_CLIENT_TYPE; } List clients = oAuth2Properties.getClientConfigurations(); if(clients==null){ throw new ValidationException("请求头中无client信息"); } String authorization =""; for (OAuth2Properties.ClientConfiguration webClientConfiguration :clients){ if(clientType.equals(webClientConfiguration.getClientType())){ String clientId = webClientConfiguration.getClientId(); String secret = webClientConfiguration.getSecret(); byte[] bytes = (clientId+":"+secret).getBytes(); authorization = Base64.getEncoder().encodeToString(bytes); break; } } return BASIC_+authorization; } public ClientDetails getClient(String clientType){ String authorization = clientAuthorization(clientType); if (StringUtils.isBlank(authorization) || !authorization.startsWith(BASIC_)) { throw new ValidationException( "请求头中无client信息"); } String[] tokens = AuthUtils.extractAndDecodeHeader(authorization); if (tokens.length != 2) { throw new ValidationException( "请求头错误"); } String clientId = tokens[0]; String clientSecret = tokens[1]; ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) { throw new ValidationException("请求头错误"); } return clientDetails; } public OAuth2AccessToken getAccessToken(Authentication authentication,String clientType){ ClientDetails clientDetails = getClient(clientType); TokenRequest tokenRequest = new TokenRequest(MapUtil.newHashMap(), clientDetails.getClientId(), clientDetails.getScope(), "password"); OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); OAuth2AccessToken token = authorizationServerTokenServices.createAccessToken(oAuth2Authentication); return token; } }