From c2d8465faade429e8b8f677864b0bc2da763e71c Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期二, 23 十一月 2021 11:57:55 +0800
Subject: [PATCH] Merge branch 'master' of ssh://192.168.0.10:29418/pcalife/PAM

---
 /dev/null                                                                                 |   15 ---
 pamapi/src/main/resources/config/application-sit.yml                                      |    2 
 pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java                       |  107 +++++++++++++++------
 pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java                             |   40 ++-----
 pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java                            |   17 +-
 pamapi/src/main/resources/logback-spring.xml                                              |   21 ++++
 pamapi/src/doc/登入API/客戶發OTP.txt                                                           |   16 +++
 pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java |   16 ++
 pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java                           |   24 ++++
 pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java                           |    6 +
 10 files changed, 177 insertions(+), 87 deletions(-)

diff --git "a/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274EmailOTP.txt" "b/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274EmailOTP.txt"
deleted file mode 100644
index d1fba1e..0000000
--- "a/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274EmailOTP.txt"
+++ /dev/null
@@ -1,15 +0,0 @@
-http post:
-http://localhost:8080/api/otp/byEmail
-
-request body:
-{
-    "email":"test@pollex.com.tw"
-}
-
-response body:
-{
-    "indexKey": "7830d17b",
-    "success": true,
-    "failCode": "",
-    "failReason": ""
-}
diff --git "a/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274OTP.txt" "b/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274OTP.txt"
new file mode 100644
index 0000000..732f42a
--- /dev/null
+++ "b/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274OTP.txt"
@@ -0,0 +1,16 @@
+http post:
+http://localhost:8080/api/otp/sendOtp
+
+request body:
+{
+    "loginType":"SMS",          // "SMS"嚗tp������"EMAIL":Otp�email
+    "account": "0912345678",    // �loginType憛俟MS��府甈葆�����MAIL��葆��隞嗡縑蝞�
+}
+
+response body:
+{
+    "indexKey": "7c8c38a2",     // ��撣嗅otp隤���
+    "success": true,            // Otp��������
+    "failCode": "",
+    "failReason": ""
+}
diff --git "a/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274\346\211\213\346\251\237OTP.txt" "b/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274\346\211\213\346\251\237OTP.txt"
deleted file mode 100644
index 6072e63..0000000
--- "a/pamapi/src/doc/\347\231\273\345\205\245API/\345\256\242\346\210\266\347\231\274\346\211\213\346\251\237OTP.txt"
+++ /dev/null
@@ -1,15 +0,0 @@
-http post:
-http://localhost:8080/api/otp/byPhone
-
-request body:
-{
-    "phone":"0912345678"
-}
-
-response body:
-{
-    "indexKey": "5913a8cd",
-    "success": true,
-    "failCode": "",
-    "failReason": ""
-}
diff --git a/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java
new file mode 100644
index 0000000..43635cd
--- /dev/null
+++ b/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java
@@ -0,0 +1,6 @@
+package com.pollex.pam.enums;
+
+public enum OtpLoginTypeEnum {
+    SMS,
+    EMAIL
+}
diff --git a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java
index 28a2a19..35a6ce8 100644
--- a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java
+++ b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java
@@ -17,6 +17,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 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.authentication.AuthenticationCredentialsNotFoundException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
@@ -32,10 +34,7 @@
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Component
 public class EServiceAuthenticationProvider {
@@ -98,6 +97,7 @@
         String dtoJson = new ObjectMapper().writeValueAsString(dto);
 
         RestTemplate restTemplate = getTrustAllRestTemplate();
+        settingMessageConvertesToSpecifyType(restTemplate, MediaType.ALL);
 
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
@@ -120,4 +120,12 @@
         requestFactory.setReadTimeout(300000);
         return new RestTemplate(requestFactory);
     }
+
+    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);
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
index 35c9a63..144e202 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
@@ -22,7 +22,8 @@
 
     public OtpResponseDTO sendByPhone(String phone) throws ServiceException, RemoteException {
         OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
-        log.info("call OtpService snedOtpBySMS, ");
+        log.info("call OtpService sendOtpBySMS, url = {}, systemType = {}, service password = {}, phone = {}",
+            applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), phone);
 
         String[] result =
             stub.sendOtpBySMS(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), phone);
@@ -32,21 +33,19 @@
 
     public OtpResponseDTO sendByEmail(String email) throws ServiceException, RemoteException {
         OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
+        log.info("call OtpService sendByEmail, url = {}, systemType = {}, service password = {}, email = {}",
+            applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), email);
 
         String[] result =
             stub.sendOtpByEmail(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), email);
 
-        final OtpResponseDTO otpResponseDTO = new OtpResponseDTO(result);
-        if(otpResponseDTO.isSuccess()) {
-            return otpResponseDTO;
-        }
-        else {
-            throw new RuntimeException("error code = " + otpResponseDTO.getFailCode() + ", error reason = " + otpResponseDTO.getFailReason());
-        }
+        return new OtpResponseDTO(result);
     }
 
     public OtpResponseDTO verifyOTP(String indexKey, String otpCode) throws ServiceException, RemoteException {
         OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
+        log.info("call OtpService verifyOTP, url = {}, systemType = {}, service password = {}, indexKey = {}, otpCode = {}",
+            applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), indexKey, otpCode);
 
         String[] result =
             stub.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
@@ -54,7 +53,7 @@
         return new OtpResponseDTO(result);
     }
 
-    private OtpWebServicePortBindingStub getOtpWebServicePortBindingStub() throws ServiceException {
+    public OtpWebServicePortBindingStub getOtpWebServicePortBindingStub() throws ServiceException {
         OtpWebServiceLocator locator = new OtpWebServiceLocator();
         locator.setOtpWebServicePortEndpointAddress(applicationProperty.getOtpWebServiceUrl());
 
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
index bb55739..6308dac 100644
--- a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
@@ -1,15 +1,13 @@
 package com.pollex.pam.web.rest;
 
 import com.pollex.pam.config.ApplicationProperties;
+import com.pollex.pam.enums.OtpLoginTypeEnum;
 import com.pollex.pam.security.jwt.JWTFilter;
 import com.pollex.pam.security.jwt.TokenProvider;
 import com.pollex.pam.security.token.OtpAuthenticationToken;
 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.web.rest.vm.OtpEmailLoginVM;
-import com.pollex.pam.web.rest.vm.OtpSMSLoginVM;
-import com.pollex.pam.web.rest.vm.VerifyOtpVM;
+import com.pollex.pam.web.rest.vm.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,14 +20,8 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.xml.rpc.ServiceException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
 import java.rmi.RemoteException;
-import java.util.Arrays;
-import java.util.Random;
 import java.util.UUID;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
 
 @RestController
 @RequestMapping("/api/otp")
@@ -49,29 +41,21 @@
     @Autowired
     TokenProvider tokenProvider;
 
-    @PostMapping("/byPhone")
-    public ResponseEntity<Object> sendOtpByPhone(@RequestBody OtpSMSLoginVM login) {
+    @PostMapping("/sendOtp")
+    public ResponseEntity<Object> sendOtp(@RequestBody OtpLoginVM login) {
         try {
             if(applicationProperty.isMockLogin()) {
-                return new ResponseEntity<>(getMockOtpResponse(), HttpStatus.OK);
+                return new ResponseEntity<>(getMockSendOtpResponse(), HttpStatus.OK);
             }
 
-            OtpResponseDTO otpResponseDTO = otpWebService.sendByPhone(login.getPhone());
-            return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
-        } catch (ServiceException | RemoteException e) {
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("connecting otp web service error");
-        }
-    }
-
-    @PostMapping("/byEmail")
-    public ResponseEntity<Object> sendOtpByEmail(@RequestBody OtpEmailLoginVM login) {
-        try {
-            if(applicationProperty.isMockLogin()) {
-                return new ResponseEntity<>(getMockOtpResponse(), HttpStatus.OK);
+            if(login.getLoginType() == OtpLoginTypeEnum.SMS) {
+                return new ResponseEntity<>(otpWebService.sendByPhone(login.getAccount()), HttpStatus.OK);
+            }
+            else if(login.getLoginType() == OtpLoginTypeEnum.EMAIL) {
+                return new ResponseEntity<>(otpWebService.sendByEmail(login.getAccount()), HttpStatus.OK);
             }
 
-            OtpResponseDTO otpResponseDTO = otpWebService.sendByEmail(login.getEmail());
-            return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
+            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("can not support this login type, loginType = " + login.getLoginType().name());
         } catch (ServiceException | RemoteException e) {
             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("connecting otp web service error");
         }
@@ -93,7 +77,7 @@
         return new ResponseEntity<>(new UserJWTController.JWTToken(jwt), httpHeaders, HttpStatus.OK);
     }
 
-    private OtpResponseDTO getMockOtpResponse() {
+    private OtpResponseDTO getMockSendOtpResponse() {
         String indexKey = UUID.randomUUID().toString().substring(0, 8);
         return new OtpResponseDTO(new String[]{indexKey, "0", "", ""});
     }
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
index 07691a3..f9b11dc 100644
--- a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
@@ -1,5 +1,6 @@
 package com.pollex.pam.web.rest;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.pollex.pam.config.ApplicationProperties;
 import com.pollex.pam.security.jwt.JWTFilter;
 import com.pollex.pam.security.jwt.TokenProvider;
@@ -7,22 +8,43 @@
 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.EServiceRequest;
+import com.pollex.pam.service.dto.EServiceResponse;
 import com.pollex.pam.service.dto.OtpResponseDTO;
 import com.pollex.pam.web.rest.vm.OtpAccount;
+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 org.springframework.web.client.RestTemplate;
+import tw.com.softleader.otp.ws.OtpWebServicePortBindingStub;
 
+import javax.net.ssl.SSLContext;
 import javax.xml.rpc.ServiceException;
 import java.rmi.RemoteException;
+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;
 
+
+// todo嚗����login�靘蹂蝙��get��撘�嚗��歇��OtpResource��ServiceResource嚗蜓閬�����
+@Deprecated
 @RestController
 @RequestMapping("/api/testLogin")
 public class TestLoginResource {
@@ -46,44 +68,69 @@
 
     @GetMapping("/bySMS")
     public ResponseEntity<OtpResponseDTO> sendOtpBySMS(@RequestParam("phone") String phone) throws ServiceException, RemoteException {
-        otpWebService.sendByPhone(phone);
-        return new ResponseEntity<>(HttpStatus.OK);
+        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 {
-        otpWebService.sendByEmail(email);
-        return new ResponseEntity<>(HttpStatus.OK);
+        final OtpResponseDTO otpResponseDTO = otpWebService.sendByEmail(email);
+        return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
     }
 
     @GetMapping("/verifyOtp")
-    public ResponseEntity<UserJWTController.JWTToken> verifyOtp(@RequestParam("account") String account, @RequestParam("indexKey") String indexKey, @RequestParam("otpCode") String otpCode) throws ServiceException, RemoteException {
-        OtpAccount otpAccount = new OtpAccount(account, indexKey);
-        OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(
-            otpAccount,
-            otpCode
-        );
+    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);
 
-        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);
+        String[] result =
+            stub.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
+
+        return new ResponseEntity<>(new OtpResponseDTO(result), 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
-        );
+    public ResponseEntity<EServiceResponse> loginByEService(@RequestParam("account") String account, @RequestParam("password") String password) throws Exception {
+        EServiceRequest dto = new EServiceRequest();
+        dto.setFunc("ValidateUserLogin");
+        dto.setId(account);
+        dto.setPin(password);
+        dto.setPwd(password);
+        dto.setSys("epos");
 
-        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);
+        String dtoJson = new ObjectMapper().writeValueAsString(dto);
+
+        RestTemplate restTemplate = getTrustAllRestTemplate();
+        settingMessageConvertesToSpecifyType(restTemplate, MediaType.ALL);
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+
+        HttpEntity<String> entity = new HttpEntity<>(dtoJson, headers);
+        return restTemplate.exchange(applicationProperty.geteServiceLoginUrl(), HttpMethod.POST, entity, EServiceResponse.class);
+    }
+
+    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);
     }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java
new file mode 100644
index 0000000..e376624
--- /dev/null
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java
@@ -0,0 +1,24 @@
+package com.pollex.pam.web.rest.vm;
+
+import com.pollex.pam.enums.OtpLoginTypeEnum;
+
+public class OtpLoginVM {
+    private OtpLoginTypeEnum loginType;
+    private String account;
+
+    public OtpLoginTypeEnum getLoginType() {
+        return loginType;
+    }
+
+    public void setLoginType(OtpLoginTypeEnum loginType) {
+        this.loginType = loginType;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+}
diff --git a/pamapi/src/main/resources/config/application-sit.yml b/pamapi/src/main/resources/config/application-sit.yml
index 93ca69e..9f0db70 100644
--- a/pamapi/src/main/resources/config/application-sit.yml
+++ b/pamapi/src/main/resources/config/application-sit.yml
@@ -115,4 +115,4 @@
   otp-web-service-url: https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService
   otp-web-service-password: es20!%Pass
   otp-web-service-system-type: epos
-  e-service-login-url: https://ssotwsit.eservice.pcalife.com.tw/sso/acctValidate
+  e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate
diff --git a/pamapi/src/main/resources/logback-spring.xml b/pamapi/src/main/resources/logback-spring.xml
index b2448bd..14883da 100644
--- a/pamapi/src/main/resources/logback-spring.xml
+++ b/pamapi/src/main/resources/logback-spring.xml
@@ -4,6 +4,27 @@
 <configuration scan="true">
     <include resource="org/springframework/boot/logging/logback/base.xml"/>
 
+    <property name="logback.dir" value="/appublic/applications/pamapi"/>
+
+    <springProfile name="sit,uat,prod">
+        <appender name="logToFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <File>${logback.dir}/pamapi_server.log</File>
+            <rollingPolicy  class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <FileNamePattern>${logback.dir}/log.%d{yyyy-MM-dd}.zip</FileNamePattern>
+                <maxHistory>180</maxHistory>
+                <totalSizeCap>2GB</totalSizeCap>
+            </rollingPolicy>
+            <encoder>
+                <charset>UTF-8</charset>
+                <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
+            </encoder>
+        </appender>
+
+        <root level="DEBUG">
+            <appender-ref ref="logToFile" />
+        </root>
+    </springProfile>
+
 <!-- The FILE and ASYNC appenders are here as examples for a production configuration -->
 <!--
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

--
Gitblit v1.8.0