Forráskód Böngészése

update login logic with login typ

fengchang_fight 1 éve
szülő
commit
5f8ed98f88
16 módosított fájl, 284 hozzáadás és 148 törlés
  1. 1 1
      hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/model/User.java
  2. 11 0
      hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLog.xml
  3. 2 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/Constants.java
  4. 68 24
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/CustomAuthenticationProvider.java
  5. 0 76
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/FacebookAuthProvider.java
  6. 0 5
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/MyWebSecurityConfiguration.java
  7. 93 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicLoginController.java
  8. 1 1
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicRegisterController.java
  9. 4 4
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/UserMapper.java
  10. 15 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/PreregisterFacebookReqDTO.java
  11. 11 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/UpdateLoginTypeRequestDTO.java
  12. 2 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/User.java
  13. 2 2
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/utils/UserUtil.java
  14. 1 1
      hichina-main-back/src/main/resources/application-dev.properties
  15. 1 1
      hichina-main-front-mobile-first/src/pages/BlogEditPage.vue
  16. 72 33
      hichina-main-front-mobile-first/src/pages/LoginPage.vue

+ 1 - 1
hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/model/User.java

@@ -29,5 +29,5 @@ public class User {
     private String profileImageUrl;
     private String passportImageUrl;
     private Integer pwdCode;
-
+    private String loginType;
 }

+ 11 - 0
hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLog.xml

@@ -322,6 +322,11 @@
     <changeSet author="xiefengchang (generated)" id="1683210780495-39">
         <addUniqueConstraint columnNames="username" constraintName="uniqueusernameinusertable" tableName="user"/>
     </changeSet>
+    <changeSet  author="liquibase-docs"  id="dropUniqueConstraint-username-in-user">
+        <dropUniqueConstraint  constraintName="uniqueusernameinusertable"
+                               tableName="user"
+                               uniqueColumns="username"/>
+    </changeSet>
     <changeSet author="xiefengchang (generated)" id="1683210780495-40">
         <addUniqueConstraint columnNames="wx_id" constraintName="uniquewxidinusertable" tableName="user"/>
     </changeSet>
@@ -503,4 +508,10 @@
                 newDataType="VARCHAR(500)"
                 tableName="destination"/>
     </changeSet>
+    <changeSet author="liquibase-docs" id="add-user-logintype">
+        <addColumn tableName="user">
+            <column name="login_type"
+                    type="varchar(100)"/>
+        </addColumn>
+    </changeSet>
 </databaseChangeLog>

+ 2 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/Constants.java

@@ -4,4 +4,6 @@ public class Constants {
     public static String PRODUCTDETAILPAGE="ProductDetailPage";
     public static String BLOGDETAILPAGE="BlogDetailPage";
     public static String DESTINATIONDETAILPAGE="DestinationDetailPage";
+    public static String REGULAR_LOGIN="regular";
+    public static String FACEBOOK_LOGIN="facebook";
 }

+ 68 - 24
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/CustomAuthenticationProvider.java

@@ -2,6 +2,8 @@ package com.hichina.main.back.hichinamainback.config;
 
 import com.hichina.main.back.hichinamainback.mapper.UserMapper;
 import com.hichina.main.back.hichinamainback.model.User;
+import com.hichina.main.back.hichinamainback.utils.FacebookAccessTokenValidator;
+import com.hichina.main.back.hichinamainback.utils.UserUtil;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +20,7 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Component
@@ -25,23 +28,33 @@ public class CustomAuthenticationProvider implements AuthenticationProvider {
     @Autowired
     private UserMapper userMapper;
 
+    @Autowired
+    private FacebookAccessTokenValidator facebookAccessTokenValidator;
+
+
+    /**
+     * the assumption for this method is, register already happens for this user, otherwise login fails
+     * @param authentication the authentication request object.
+     * @return
+     * @throws AuthenticationException
+     */
     @Override
     public Authentication authenticate(Authentication authentication)
             throws AuthenticationException {
+        // this name here is actually the login identity, which is email by default
         String name = authentication.getName();
+        // this password is password for normal login, and accesstoken string for facebook login
         String password = authentication.getCredentials().toString();
 
-        if(name.contains(",") || StringUtils.isEmpty(password)){
-            return null;
-        }
-
         try {
-            List<User> users = userMapper.findByUsernameOrEmail(name);
-            if(users.isEmpty()){
+            User user = UserUtil.getUserByEmail(userMapper, name);
+
+            // user not exist for this email, login fail
+            if(user==null){
                 return null;
             }
-            User user = users.get(0);
-            if(correctUserNameAndPassword(user, password)){
+
+            if(correctUserNameAndPassword(user, password, user.getLoginType())){
                 return new UsernamePasswordAuthenticationToken(user.getUsername()+"["+user.getEmail()+"]", password, new ArrayList<>());
             }else{
                 return null;
@@ -53,26 +66,57 @@ public class CustomAuthenticationProvider implements AuthenticationProvider {
         }
     }
 
-    private Boolean correctUserNameAndPassword(User user, String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
 
-        String storedPassord = user.getPassword();
-        Integer pwdCode = user.getPwdCode();
-        if(pwdCode!=null && pwdCode==-1){
-            return newLoginLogicCheck(user, password);
+    private User generateOrUpdateUser(String fbId, String name, String email, String profileImageUrl){
+        User user = UserUtil.getUserByEmail(userMapper, email);
+        if(user==null){
+            //register new user
+            user = new User();
+            user.setCreatedTime(new Date());
+            user.setSalt(CustomAuthenticationProvider.generateSalt());
+            user.setUsername(name);
+            user.setPassword("");
+            user.setEmail(email);
+            user.setFacebookId(fbId);
+            user.setProfileImageUrl(profileImageUrl);
+            user.setPwdCode(-1);
+            user.setUserId(java.util.UUID.randomUUID().toString());
+            userMapper.insert(user);
         }else{
-            // old logic, allow old logic only once here
-            if(validatePasswordTheOldWay(password,storedPassord, pwdCode )){
-                // update pwdcode -1,  generate random salt, use the salt and new logic to generate encrypted password
-                String salt = generateSalt();
-                user.setSalt(salt);
-                user.setPwdCode(-1);
-                user.setPassword(generateStrongPasswordHash(password, salt));
-                userMapper.update(user);
-
-                return true;
+            // update user with facebook info
+            user.setFacebookId(fbId);
+            user.setUsername(name);
+            user.setProfileImageUrl(profileImageUrl);
+            userMapper.update(user);
+        }
+        return user;
+    }
+
+    private Boolean correctUserNameAndPassword(User user, String password, String loginType) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        if(StringUtils.isEmpty(loginType) || Constants.REGULAR_LOGIN.equals(loginType)){
+            String storedPassord = user.getPassword();
+            Integer pwdCode = user.getPwdCode();
+            if(pwdCode!=null && pwdCode==-1){
+                return newLoginLogicCheck(user, password);
             }else{
-                return false;
+                // old logic, allow old logic only once here
+                if(validatePasswordTheOldWay(password,storedPassord, pwdCode )){
+                    // update pwdcode -1,  generate random salt, use the salt and new logic to generate encrypted password
+                    String salt = generateSalt();
+                    user.setSalt(salt);
+                    user.setPwdCode(-1);
+                    user.setPassword(generateStrongPasswordHash(password, salt));
+                    userMapper.update(user);
+
+                    return true;
+                }else{
+                    return false;
+                }
             }
+        }else if(Constants.FACEBOOK_LOGIN.equals(loginType)){
+            return facebookAccessTokenValidator.validateAccessToken(password);
+        }else{
+            return false;
         }
     }
 

+ 0 - 76
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/FacebookAuthProvider.java

@@ -1,76 +0,0 @@
-package com.hichina.main.back.hichinamainback.config;
-
-import com.hichina.main.back.hichinamainback.mapper.UserMapper;
-import com.hichina.main.back.hichinamainback.model.User;
-import com.hichina.main.back.hichinamainback.utils.FacebookAccessTokenValidator;
-import com.hichina.main.back.hichinamainback.utils.UserUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Date;
-
-@Component
-public class FacebookAuthProvider implements AuthenticationProvider {
-    @Autowired
-    private UserMapper userMapper;
-
-    @Autowired
-    private FacebookAccessTokenValidator facebookAccessTokenValidator;
-
-    private User generateOrUpdateUser(String fbId, String name, String email, String profileImageUrl){
-        User user = UserUtil.getUserByEmail(userMapper, email);
-        if(user==null){
-            //register new user
-            user = new User();
-            user.setCreatedTime(new Date());
-            user.setSalt(CustomAuthenticationProvider.generateSalt());
-            user.setUsername(name);
-            user.setPassword("");
-            user.setEmail(email);
-            user.setFacebookId(fbId);
-            user.setProfileImageUrl(profileImageUrl);
-            user.setPwdCode(-1);
-            user.setUserId(java.util.UUID.randomUUID().toString());
-            userMapper.insert(user);
-        }else{
-            // update user with facebook info
-            user.setFacebookId(fbId);
-            user.setUsername(name);
-            user.setProfileImageUrl(profileImageUrl);
-            userMapper.update(user);
-        }
-        return user;
-    }
-
-    @Override
-    public Authentication authenticate(Authentication authentication)
-            throws AuthenticationException {
-        String idNameEmailCombo = authentication.getName();
-        String accessToken = authentication.getCredentials().toString();
-
-        boolean authed = facebookAccessTokenValidator.validateAccessToken(accessToken);
-        if(!authed){
-            return null;
-        }
-        String[] arrs = idNameEmailCombo.split(",");
-        if(arrs.length!=4){
-            return null;
-        }
-        String fbId = arrs[0];
-        String name = arrs[1];
-        String email = arrs[2];
-        String profileImageUrl = arrs[3];
-        User user = generateOrUpdateUser(fbId, name, email, profileImageUrl);
-        return new UsernamePasswordAuthenticationToken(user.getUsername()+"["+user.getEmail()+"]", accessToken, new ArrayList<>());
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return authentication.equals(UsernamePasswordAuthenticationToken.class);
-    }
-}

+ 0 - 5
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/config/MyWebSecurityConfiguration.java

@@ -25,16 +25,11 @@ public class MyWebSecurityConfiguration {
 
     @Autowired
     private CustomAuthenticationProvider authProvider;
-
-    @Autowired
-    private FacebookAuthProvider facebookAuthProvider;
-
     @Bean
     public AuthenticationManager authManager(HttpSecurity http) throws Exception {
         AuthenticationManagerBuilder authenticationManagerBuilder =
                 http.getSharedObject(AuthenticationManagerBuilder.class);
         authenticationManagerBuilder.authenticationProvider(authProvider);
-        authenticationManagerBuilder.authenticationProvider(facebookAuthProvider);
         return authenticationManagerBuilder.build();
     }
 

+ 93 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicLoginController.java

@@ -0,0 +1,93 @@
+package com.hichina.main.back.hichinamainback.controller;
+
+import com.google.gson.JsonObject;
+import com.hichina.main.back.hichinamainback.config.Constants;
+import com.hichina.main.back.hichinamainback.config.CustomAuthenticationProvider;
+import com.hichina.main.back.hichinamainback.mapper.UserMapper;
+import com.hichina.main.back.hichinamainback.model.DTO.HichinaResponse;
+import com.hichina.main.back.hichinamainback.model.DTO.PreregisterFacebookReqDTO;
+import com.hichina.main.back.hichinamainback.model.DTO.UpdateLoginTypeRequestDTO;
+import com.hichina.main.back.hichinamainback.model.User;
+import com.hichina.main.back.hichinamainback.utils.FacebookAccessTokenValidator;
+import com.hichina.main.back.hichinamainback.utils.HttpUtils;
+import com.hichina.main.back.hichinamainback.utils.UserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/api/public/login")
+public class PublicLoginController {
+
+    private static final String GRAPH_API_URL = "https://graph.facebook.com/v14.0/me?access_token=";
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private FacebookAccessTokenValidator facebookAccessTokenValidator;
+
+
+    @Autowired
+    private Environment env;
+
+    @PostMapping("/prereg-facebook")
+    public HichinaResponse preRegisterFacebook(@RequestBody PreregisterFacebookReqDTO request){
+        HichinaResponse ret = new HichinaResponse();
+        if(facebookAccessTokenValidator.validateAccessToken(request.getAccessToken())){
+            // if already exist, just update some property, otherwise, register one and set corresponding login type to facebook
+            generateOrUpdateUser(request.getFacebookId(), request.getName(), request.getEmail(), request.getProfileImageUrl());
+            ret.setOk(true);
+            ret.setMessage("Succeed pre register or update facebook user");
+        }else{
+            ret.setOk(false);
+            ret.setMessage("Access token not valid for facebook login");
+        }
+        return ret;
+    }
+
+    @PutMapping("/type")
+    public HichinaResponse updateLoginType(@RequestBody UpdateLoginTypeRequestDTO request){
+        HichinaResponse ret = new HichinaResponse();
+        User user = UserUtil.getUserByEmail(userMapper, request.getEmail());
+        if(user==null){
+            ret.setOk(false);
+            ret.setMessage(String.format("User does not exist for email: %s", request.getEmail()));
+        }else{
+            user.setLoginType(request.getLoginType());
+            userMapper.update(user);
+            ret.setOk(true);
+            ret.setMessage(String.format("Succeed updating login type for user : %s", request.getEmail()));
+        }
+        return ret;
+    }
+
+    private User generateOrUpdateUser(String fbId, String name, String email, String profileImageUrl){
+        User user = UserUtil.getUserByEmail(userMapper, email);
+        if(user==null){
+            //register new user
+            user = new User();
+            user.setCreatedTime(new Date());
+            user.setSalt(CustomAuthenticationProvider.generateSalt());
+            user.setUsername(name);
+            user.setPassword("");
+            user.setEmail(email);
+            user.setFacebookId(fbId);
+            user.setProfileImageUrl(profileImageUrl);
+            user.setPwdCode(-1);
+            user.setUserId(java.util.UUID.randomUUID().toString());
+            user.setLoginType(Constants.FACEBOOK_LOGIN);
+            userMapper.insert(user);
+        }else{
+            // update user with facebook info
+            user.setFacebookId(fbId);
+            user.setUsername(name);
+            user.setProfileImageUrl(profileImageUrl);
+            user.setLoginType(Constants.FACEBOOK_LOGIN);
+            userMapper.update(user);
+        }
+        return user;
+    }
+}

+ 1 - 1
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicRegisterController.java

@@ -42,7 +42,7 @@ public class PublicRegisterController {
     public HichinaResponse register(@RequestBody RegisterDTO request){
         HichinaResponse ret = new HichinaResponse();
 
-        List<User> users = userMapper.findByUsernameOrEmail(request.getEmail());
+        List<User> users = userMapper.findByEmail(request.getEmail());
 
         if(!users.isEmpty()){
             ret.setOk(false);

+ 4 - 4
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/UserMapper.java

@@ -13,12 +13,12 @@ import java.util.List;
 @Component(value = "userMapper")
 public interface UserMapper {
 
-    @Select("select * from user where username=#{account} or email=#{account}")
-    List<User> findByUsernameOrEmail(String account);
+    @Select("select * from user where email=#{account}")
+    List<User> findByEmail(String account);
 
-    @Update("update user SET salt=#{salt},password=#{password},created_time=#{createdTime},email=#{email},facebook_id=#{facebookId},google_id=#{googleId},wx_id=#{wxId},phone=#{phone},username=#{username},gender=#{gender},birth_date=#{birthDate},nationality=#{nationality},license_type=#{licenseType},license_number=#{licenseNumber},license_sign_date=#{licenseSignDate},license_expire_date=#{licenseExpireDate},signature=#{signature},profile_image_url=#{profileImageUrl},passport_image_url=#{passportImageUrl},pwd_code=#{pwdCode} where user_id=#{userId}")
+    @Update("update user SET salt=#{salt},password=#{password},created_time=#{createdTime},email=#{email},facebook_id=#{facebookId},google_id=#{googleId},wx_id=#{wxId},phone=#{phone},username=#{username},gender=#{gender},birth_date=#{birthDate},nationality=#{nationality},license_type=#{licenseType},license_number=#{licenseNumber},license_sign_date=#{licenseSignDate},license_expire_date=#{licenseExpireDate},signature=#{signature},profile_image_url=#{profileImageUrl},passport_image_url=#{passportImageUrl},pwd_code=#{pwdCode},login_type=#{loginType} where user_id=#{userId}")
     void update(User user);
 
-    @Insert("insert into user(user_id, salt, password, created_time, email, facebook_id, google_id, wx_id, phone, username, gender, birth_date, nationality, license_type, license_number, license_sign_date, license_expire_date, signature, profile_image_url, passport_image_url, pwd_code) VALUES(#{userId}, #{salt}, #{password}, #{createdTime}, #{email}, #{facebookId}, #{googleId}, #{wxId}, #{phone}, #{username}, #{gender}, #{birthDate}, #{nationality}, #{licenseType}, #{licenseNumber}, #{licenseSignDate}, #{licenseExpireDate}, #{signature}, #{profileImageUrl}, #{passportImageUrl}, #{pwdCode})")
+    @Insert("insert into user(user_id, salt, password, created_time, email, facebook_id, google_id, wx_id, phone, username, gender, birth_date, nationality, license_type, license_number, license_sign_date, license_expire_date, signature, profile_image_url, passport_image_url, pwd_code, login_type) VALUES(#{userId}, #{salt}, #{password}, #{createdTime}, #{email}, #{facebookId}, #{googleId}, #{wxId}, #{phone}, #{username}, #{gender}, #{birthDate}, #{nationality}, #{licenseType}, #{licenseNumber}, #{licenseSignDate}, #{licenseExpireDate}, #{signature}, #{profileImageUrl}, #{passportImageUrl}, #{pwdCode}, #{loginType})")
     void insert(User user);
 }

+ 15 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/PreregisterFacebookReqDTO.java

@@ -0,0 +1,15 @@
+package com.hichina.main.back.hichinamainback.model.DTO;
+
+import com.hichina.main.back.hichinamainback.model.User;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class PreregisterFacebookReqDTO {
+    private String facebookId;
+    private String name;
+    private String email;
+    private String profileImageUrl;
+    private String accessToken;
+}

+ 11 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/UpdateLoginTypeRequestDTO.java

@@ -0,0 +1,11 @@
+package com.hichina.main.back.hichinamainback.model.DTO;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class UpdateLoginTypeRequestDTO {
+    private String email;
+    private String loginType;
+}

+ 2 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/User.java

@@ -48,4 +48,6 @@ public class User {
     private String passportImageUrl;
 
     private Integer pwdCode;
+
+    private String loginType;
 }

+ 2 - 2
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/utils/UserUtil.java

@@ -18,7 +18,7 @@ public class UserUtil {
 
     public static User getUserByCurrentPrincipal(UserMapper userMapper, String principalCombo){
         String email = extractEmailFromPrincipal(principalCombo);
-        List<User> users = userMapper.findByUsernameOrEmail(email);
+        List<User> users = userMapper.findByEmail(email);
         if(users.isEmpty()){
             throw new RuntimeException("Did not get user from current principal");
         }else{
@@ -27,7 +27,7 @@ public class UserUtil {
     }
 
     public static User getUserByEmail(UserMapper userMapper, String email){
-        List<User> users = userMapper.findByUsernameOrEmail(email);
+        List<User> users = userMapper.findByEmail(email);
         if(users.isEmpty()){
             return null;
         }else{

+ 1 - 1
hichina-main-back/src/main/resources/application-dev.properties

@@ -1,6 +1,6 @@
 server.port=9052
 
-spring.datasource.url=jdbc:mysql://localhost:3306/unified_hichina?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&&allowMultiQueries=true
+spring.datasource.url=jdbc:mysql://localhost:3306/unified_hichina?zeroDateTimeBehavior=convertToNull&useUnicode=true&allowMultiQueries=true
 spring.datasource.username=root
 spring.datasource.password=Passw0rd
 spring.datasource.tomcat.max-wait=20000

+ 1 - 1
hichina-main-front-mobile-first/src/pages/BlogEditPage.vue

@@ -146,7 +146,7 @@ export default {
         })
         .catch((err) => {
           console.error("Error:", err);
-          $gp.$hideLoading($q);
+          gp.$hideLoading($q);
           gp.$generalNotify($q, false, "Error:", err);
           if (err.response.status == 401) {
             gp.$goPage("/auth/login");

+ 72 - 33
hichina-main-front-mobile-first/src/pages/LoginPage.vue

@@ -13,7 +13,7 @@
             :rules="[(val) => !!val || 'Field is required']"
             color="blue-12"
             v-model="username"
-            label="Enter your email/username"
+            label="Enter your email"
             ref="usernameInput"
           >
             <template v-slot:prepend>
@@ -77,19 +77,48 @@ export default {
           password: password.value,
         };
 
+        const updateLoginTypeParams = {};
+        updateLoginTypeParams.email = username.value;
+        updateLoginTypeParams.loginType = "regular";
+
+        gp.$showLoading($q);
         api
-          .post("/login", Qs.stringify(data), {
-            headers: { "Content-Type": "application/x-www-form-urlencoded" },
-          })
-          .then((response) => {
-            gp.$generalNotify($q, true, "Login succeed!");
-            location.reload();
+          .put("/api/public/login/type", updateLoginTypeParams)
+          .then((res) => {
+            // if succeed updating login type to regular
+            if (res.data.ok == true) {
+              // could succeed updating login type,  do real login
+              api
+                .post("/login", Qs.stringify(data), {
+                  headers: {
+                    "Content-Type": "application/x-www-form-urlencoded",
+                  },
+                })
+                .then((response) => {
+                  gp.$generalNotify($q, true, "Login succeed!");
+                  location.reload();
+                })
+                .catch((e) => {
+                  gp.$generalNotify($q, false, "Fail login error ");
+                  gp.$hideLoading($q);
+                  console.log("Fail login error message: ");
+                  console.log(e);
+                });
+            } else {
+              // could fail due to user not exist
+              gp.$generalNotify($q, false, res.data.message);
+              gp.$hideLoading($q);
+            }
           })
-          .catch((e) => {
-            gp.$generalNotify($q, false, "Fail login error message: " + e);
+          .catch((err) => {
+            // could fail for unknown reason
+            gp.$generalNotify($q, false, "Fail updating login type");
+            console.log("Fail updating login type err:");
+            console.log(err);
+            gp.$hideLoading($q);
           });
       } else {
-        gp.$generalNotify($q, false, "error");
+        gp.$generalNotify($q, false, "Not valid input");
       }
     }
 
@@ -121,35 +150,45 @@ export default {
                 // try login using the oauth way
                 const params = {};
                 params.accessToken = accessToken;
-                params.id = response.id;
+                params.facebookId = response.id;
                 params.email = response.email;
                 params.name = response.name;
                 params.profileImageUrl = response.picture.data.url;
 
-                this.loading = true;
-                var data = {
-                  username:
-                    response.id +
-                    "," +
-                    response.name +
-                    "," +
-                    response.email +
-                    "," +
-                    response.picture.data.url,
-                  password: accessToken,
-                };
-
+                var emailStore = response.email;
                 api
-                  .post("/login", Qs.stringify(data), {
-                    headers: {
-                      "Content-Type": "application/x-www-form-urlencoded",
-                    },
-                  })
-                  .then((response) => {
-                    location.reload();
+                  .post("/api/public/login/prereg-facebook", params)
+                  .then((res) => {
+                    var data = {
+                      username: emailStore,
+                      password: accessToken,
+                    };
+
+                    gp.$showLoading($q);
+                    api
+                      .post("/login", Qs.stringify(data), {
+                        headers: {
+                          "Content-Type": "application/x-www-form-urlencoded",
+                        },
+                      })
+                      .then((response) => {
+                        gp.$hideLoading($q);
+                        location.reload();
+                      })
+                      .catch((e) => {
+                        gp.$hideLoading($q);
+                        gp.$generalNotify($q, false, "Error message: " + e);
+                      });
                   })
-                  .catch((e) => {
-                    gp.$generalNotify($q, false, "Error message: " + e);
+                  .catch((err) => {
+                    gp.$hideLoading(false);
+                    gp.$generalNotify(
+                      $q,
+                      false,
+                      "Fail pre register facebook user"
+                    );
+                    console.log("Fail pre register facebook user");
+                    console.log(err);
                   });
               }
             );