Firebase에서 특정 사용자 삭제
파이어베이스에서 특정 사용자 계정을 가져온 다음 삭제할 수 있는 방법이 있습니까?
예를 들어:
// I need a means of getting a specific auth user.
var user = firebase.auth().getUser(uid);
// Note the getUser function is not an actual function.
그런 다음 해당 사용자와 해당 사용자의 추가 데이터를 삭제합니다.
// This works
user.delete().then(function() {
// User deleted.
var ref = firebase.database().ref(
"users/".concat(user.uid, "/")
);
ref.remove();
});
Firebase Documentation에 따르면 사용자가 현재 로그인한 경우 다음을 삭제할 수 있습니다.
firebase.auth().currentUser.delete()
로그인한 admin 사용자가 시스템에서 다른 사용자를 삭제할 수 있도록 하는 것이 제 목표입니다.
Firebase 인증에 클라이언트 측 SDK를 사용하는 경우 현재 로그인되어 있는 사용자 계정만 삭제할 수 있습니다.다른 모든 것은 앱 사용자가 서로의 계정을 삭제할 수 있기 때문에 보안 위험이 큽니다.
Firebase 인증용 관리 SDK는 개발 시스템, 사용자가 제어하는 서버 또는 클라우드 기능과 같은 신뢰할 수 있는 환경에서 사용하도록 설계되었습니다.신뢰할 수 있는 환경에서 실행되므로 UID만 알고 사용자 계정을 삭제하는 등 클라이언트 측 SDK가 수행할 수 없는 특정 작업을 수행할 수 있습니다.
참고:
또 다른 일반적인 접근 방식은 Firebase Database와 같이 허용 목록/차단 목록을 유지하고 이를 기반으로 사용자에게 권한을 부여하는 것입니다.Firebase 3.x에서 등록을 비활성화하는 방법을 참조하십시오.
Ali Haider가 제안한 것처럼 응용 프로그램 자체에서 firebase-admin을 사용하고 싶지 않을 것입니다. 코드와 함께 배포하지 않을 개인 키가 필요하기 때문입니다.
그러나 Firestore 또는 Realtime 데이터베이스에서 사용자를 삭제할 때 트리거하는 Cloud Function을 Firebase에서 생성하고 Cloud Function이 firebase-admin을 사용하여 사용자를 삭제하도록 할 수 있습니다.저의 경우 Firestore에 Firebase Auth에서 생성한 것과 동일한 사용자 ID를 가진 사용자 컬렉션이 있으며, 여기서 이름과 역할 등과 같은 추가 사용자 데이터를 저장합니다.
저처럼 파이어스토어를 사용하는 경우 다음을 수행할 수 있습니다.실시간 데이터베이스를 사용하는 경우에는 문서에서 트리거를 사용하는 방법을 찾아보십시오.
Firebase 프로젝트에 클라우드 기능이 초기화되었는지 확인합니다.프로젝트 디렉터리에 'functions'라는 이름의 폴더가 있어야 합니다.않은 : 다음합니다.
firebase init functions
.다음 페이지의 Firebase 콘솔에서 서비스 계정의 개인 키를 얻습니다.설정 > 서비스 계정.
개인 키가 포함된 json 파일을 다음에 배치합니다.
functions\src
index.ts 파일 옆에 있는 폴더입니다.index.ts에서 다음 함수를 내보냅니다.
export const removeUser = functions.firestore.document("/users/{uid}")
.onDelete((snapshot, context) => {
const serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<DATABASE_NAME>>.firebaseio.com"
});
return admin.auth().deleteUser(context.params.uid);
});
- 이제 다음 명령을 사용하여 클라우드 기능 구축
firebase deploy --only functions
Firebase Firestore에서 사용자가 삭제되면 이 코드가 실행되고 Firebase Auth에서도 사용자가 삭제됩니다.
Firebase Cloud Functions에 대한 자세한 내용은 https://firebase.google.com/docs/functions/get-started 를 참조하십시오.
인증을 수행한 것과 동일한 방식으로 이 코드를 적용하면 됩니다.
var user = firebase.auth().currentUser;
user.delete().then(function() {
// User deleted.
}).catch(function(error) {
// An error happened.
});
Javascript API 사용(admin SDK가 아님)
이 답변이 사용자 로그인에 대해 지적하는 것처럼 로그인한 사용자가 아닌 다른 사용자를 삭제할 수 있도록 두 번째 앱을 만들어야 합니다.
제가 한 일은 다음과 같습니다.
async deleteUser (user) {
// Need to create a second app to delete another user in Firebase auth list than the logged in one.
// https://stackoverflow.com/a/38013551/2012407
const secondaryApp = firebase.initializeApp(config, 'Secondary')
if (!user.email || !user.password) {
return console.warn('Missing email or password to delete the user.')
}
await secondaryApp.auth().signInWithEmailAndPassword(user.email, user.password)
.then(() => {
const userInFirebaseAuth = secondaryApp.auth().currentUser
userInFirebaseAuth.delete() // Delete the user in Firebase auth list (has to be logged in).
secondaryApp.auth().signOut()
secondaryApp.delete()
// Then you can delete the user from the users collection if you have one.
})
}
현재 사용자를 삭제하려는 경우 Firebase 9+에 대한 간단한 솔루션은 다음과 같습니다.
import { getAuth, deleteUser } from "firebase/auth";
const auth = getAuth();
const user = auth.currentUser;
deleteUser(user).then(() => {
// User deleted.
}).catch((error) => {
// An error ocurred
// ...
});
Firebase Admin SDK 없이도 특정 사용자를 삭제할 수 있다고 생각합니다.관리할 계정의 사용자 이름, 암호를 저장해야 합니다.그리고 계정으로 로그인 - 관리자 계정을 선언합니다.그 후에는 Firebase auth를 사용하여 로그아웃 -> 삭제할 계정으로 로그인 -> Firebase auth를 사용하여 해당 계정을 삭제 -> Firebase auth를 사용하여 로그아웃 -> 해당 "관리자 계정"으로 다시 로그인하는 단계만 수행합니다.이 솔루션을 통해 Firebase Admin SDK를 사용하지 않고 계정을 삭제할 수 있기를 바랍니다.
언급URL : https://stackoverflow.com/questions/38800414/delete-a-specific-user-from-firebase
'programing' 카테고리의 다른 글
루비 문자열 내에서 문자열 "\n"을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.28 |
---|---|
피벗에서 (null) 값을 출력 0으로 바꾸는 방법 (0) | 2023.06.28 |
Node.js의 이벤트 중심 방식은 무엇이 다릅니까?ASP에서는 그렇게 할 수 없나요?넷의 HttpAsyncHandler? (0) | 2023.06.28 |
Spring - server.connection-timeout이 작동하지 않습니다. (0) | 2023.06.28 |
CONCATing NULL 필드 (0) | 2023.06.28 |