Vue PWA mylog

mylog 계정

그랜파 개발자 2024. 11. 11. 01:22

Vue로 PWA 개발 - 그랜파 개발자

Vue 프로젝트 Beta Test : mylog, 일상의 기록

개발이 진행됨에 따라 소스 코드를 계속 추가해 갑니다.

 

계정 정보 수정은 이름과 마이로그 이름만 수정할 수 있고, 별도의 폼으로 비밀번호를 변경할 수 있습니다.

 

1. 계정 정보 변경

 

마이로그 계정 항목은 이름, 마이로그 이름, 이메일, 비밀번호, uids입니다. 계정 정보 수정은 이름과 마이로그 이름만 수정할 수 있습니다.

// src/store/modules/auth.js
. . . 
// 계정 정보 수정
async updateUserInfo({ commit }, updatedInfo) {
  try {
    const userDoc = doc(db, "users", updatedInfo.id);
    await updateDoc(userDoc, updatedInfo);

    commit("setUser", updatedInfo);

    alert("계정 정보를 수정하였습니다.");
  } catch (error) {
    alert("계정 정보 수정 실패: " + error.message);
  }
},
  . . .

 

2. 비밀번호 변경

 

비밀번호 변경 버튼을 누르면 비밀번호 변경 폼이 나타나고 현재 비밀번호와 새 비밀번호를 입력하여 변경할 수 있습니다. 비밀번호 변경은 민감한 작업이므로 Firebase Authentication의 reauthenticateWithCredential 함수를 사용하여 현재 비밀번호로 재인증한 후 현재 비밀번호와 새 비밀번호로 updatePassword 함수를 사용하여 비밀번호를 변경합니다.

// src/store/modules/auth.js
. . .
// 비밀번호 변경
async changePassword({}, { oldPassword, newPassword }) {  
  const credential = EmailAuthProvider.credential(
    auth.currentUser.email,
    oldPassword
  );

  reauthenticateWithCredential(auth.currentUser, credential)
  .then(() => {
    updatePassword(auth.currentUser, newPassword)
    .then(() => {
      alert("비밀번호가 성공적으로 변경되었습니다.");
    }).catch((error) => {
      alert("비밀번호 변경 실패 : " + error.message);
    });
  })
  .catch((error) => {
    alert("재인증 실패 : " + error.message);
  });
},
. . .

 

3. Google 연동

 

Firebase Authentication에서 제공하는 signInWithPopup 함수로 구글 계정에 로그인하여 구글 계정의 uid를 받아 마이로그 users 정보 항목 중 uids에 저장합니다. signInWithPopup 함수는 팝업 창을 통해 사용자가 소셜 로그인 제공자(예: Google, Facebook, GitHub, Twitter 등)를 통해 인증할 수 있도록 합니다. 사용자는 새로운 페이지로 리디렉션되지 않고, 작은 팝업 창에서 로그인 절차를 처리하여 줍니다.

// src/store/modules/auth.js
. . .
async addGoogleAccount({ commit, dispatch, getters }) {
  try {
    const provider = new GoogleAuthProvider();
    const { user } = await signInWithPopup(auth, provider);
    try {
      // 이미 연동된 회원의 경우 알림 메시지 출력한다.
      const uid = user.uid;
      const myUser = state.users.find(user => user.uids && user.uids.includes(uid));
      if (myUser) {
        // 이미 연동되어 있다.
        alert('이미 연동되어 있습니다.');
      } else {
        // 구글 연동을 진행한다.
        dispatch('addUidToUser', user.uid);
      }          
    } catch (error) {
      commit('setError','Error adding google uid');
    }
  } catch (error) {
    commit('setError', error.message);
  }
},

// 구글 계정의 uid를 받아 user collection의 uids에 넣는다.
async addUidToUser({ state }, newUid) {      
  //console.log('user.id:', state.user.id);
  if (state.user) {
    try {
      const userDoc = doc(db, "users", state.user.id);
      updateDoc(userDoc, {
        uids: arrayUnion(newUid)
      });
      // Update the local state if neededa
      state.user.uids = [...(state.user.uids || []), newUid];
    } catch (error) {
      console.error('Error adding UID to user:', error);
    }
  }
},
. . .

 

Vue PWA 프로젝트, mylog 코드



'Vue PWA mylog' 카테고리의 다른 글

mylog 상세보기  (2) 2024.11.13
mylog 전체 보기  (0) 2024.11.11
mylog 로그인  (1) 2024.11.10
mylog 계정 만들기  (2) 2024.11.08
mylog App  (0) 2024.11.06