保誠-保戶業務員媒合平台
Tomas
2023-09-01 23f937de7378d94c74e81e6f0ef1d6a1e0f1fa0e
pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
@@ -1,28 +1,36 @@
package com.pollex.pam.web.rest;
import com.pollex.pam.config.ApplicationProperties;
import com.pollex.pam.security.jwt.JWTFilter;
import com.pollex.pam.security.jwt.TokenProvider;
import com.pollex.pam.security.token.EServiceAuthenticationToken;
import com.pollex.pam.security.token.OtpAuthenticationToken;
import com.pollex.pam.service.LoginService;
import com.pollex.pam.service.OtpWebService;
import com.pollex.pam.service.dto.OtpResponseDTO;
import com.pollex.pam.web.rest.vm.OtpAccount;
import com.pollex.pam.business.service.dto.EServiceResponse;
import com.pollex.pam.business.service.dto.OtpResponseDTO;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import tw.com.softleader.otp.ws.OtpWebServicePortBindingStub;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
// todo,僅為初期接login方便使用而用get的方式登入,目前已拆出OtpResource與EServiceResource,主要是用這兩個做登入
@@ -32,9 +40,6 @@
public class TestLoginResource {
    private final static Logger log = LoggerFactory.getLogger(TestLoginResource.class);
    @Autowired
    LoginService loginService;
    @Autowired
    ApplicationProperties applicationProperty;
@@ -49,41 +54,66 @@
    TokenProvider tokenProvider;
    @GetMapping("/bySMS")
    public ResponseEntity<OtpResponseDTO> sendOtpBySMS(@RequestParam("phone") String phone) throws ServiceException, RemoteException {
    public ResponseEntity<OtpResponseDTO> sendOtpBySMS(@RequestParam("phone") String phone) {
        final OtpResponseDTO otpResponseDTO = otpWebService.sendByPhone(phone);
        return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
    }
    @GetMapping("/byEmail")
    public ResponseEntity<OtpResponseDTO> sendOtpByEmail(@RequestParam("email") String email) throws RemoteException, ServiceException {
    public ResponseEntity<OtpResponseDTO> sendOtpByEmail(@RequestParam("email") String email) {
        final OtpResponseDTO otpResponseDTO = otpWebService.sendByEmail(email);
        return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
    }
    @GetMapping("/verifyOtp")
    public ResponseEntity<OtpResponseDTO> verifyOtp(@RequestParam("account") String account, @RequestParam("indexKey") String indexKey, @RequestParam("otpCode") String otpCode) throws ServiceException, RemoteException {
        OtpWebServicePortBindingStub stub = otpWebService.getOtpWebServicePortBindingStub();
        log.info("call OtpService verifyOTP, systemType = {}, service password = {}, indexKey = {}, paxxword = {}",
            applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), indexKey, otpCode);
        String[] result =
            stub.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
        return new ResponseEntity<>(new OtpResponseDTO(result), HttpStatus.OK);
    public ResponseEntity<OtpResponseDTO> verifyOtp(@RequestParam("account") String account, @RequestParam("indexKey") String indexKey, @RequestParam("otpCode") String otpCode) {
        final OtpResponseDTO otpResponseDTO = otpWebService.verifyOTP(indexKey, otpCode);
        return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
    }
    @GetMapping("/byEService")
    public ResponseEntity<UserJWTController.JWTToken> loginByEService(@RequestParam("account") String account, @RequestParam("password") String password) throws Exception {
        EServiceAuthenticationToken authenticationToken = new EServiceAuthenticationToken(
            account,
            password
        );
//    @GetMapping("/byEService")
//    public ResponseEntity<EServiceResponse> loginByEService(@RequestParam("account") String account, @RequestParam("password") String password) throws Exception {
//        RestTemplate restTemplate = getTrustAllRestTemplate();
//        settingMessageConvertesToSpecifyType(restTemplate, MediaType.ALL);
//
//        String urlTemplate = UriComponentsBuilder.fromHttpUrl(applicationProperty.geteServiceLoginUrl())
//            .queryParam("func", applicationProperty.geteServiceLoginFunc())
//            .queryParam("id", account)
//            .queryParam("pin", password)
//            .queryParam("pwd", password)
//            .queryParam("sys", applicationProperty.geteServiceLoginSys())
//            .queryParam("transactionId", UUID.randomUUID().toString())
//            .encode().toUriString();
//
//        log.debug("http get loginByEService, url = {}", urlTemplate);
//
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_JSON);
//
//        HttpEntity<String> entity = new HttpEntity<>(headers);
//        return restTemplate.exchange(urlTemplate, HttpMethod.GET, entity, EServiceResponse.class);
//    }
        Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        String jwt = tokenProvider.createToken(authentication, false);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer" + jwt);
        return new ResponseEntity<>(new UserJWTController.JWTToken(jwt), httpHeaders, HttpStatus.OK);
    }
//    private void settingMessageConvertesToSpecifyType(RestTemplate restTemplate, MediaType mediaType) {
//        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
//        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//        converter.setSupportedMediaTypes(Collections.singletonList(mediaType));
//        messageConverters.add(converter);
//        restTemplate.setMessageConverters(messageConverters);
//    }
//    private RestTemplate getTrustAllRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
//        SSLContext sslContext = SSLContexts.custom()
//            .loadTrustMaterial(null, (X509Certificate[] x509Certs, String s) -> true)
//            .build();
//        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
//        CloseableHttpClient httpClient = HttpClients.custom()
//            .setSSLSocketFactory(csf)
//            .build();
//        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
//        requestFactory.setHttpClient(httpClient);
//        requestFactory.setConnectTimeout(300000);
//        requestFactory.setReadTimeout(300000);
//        return new RestTemplate(requestFactory);
//    }
}