source

Firebase용 클라우드 기능 - 이메일에 대한 작업 확인

nicesource 2023. 6. 13. 22:23
반응형

Firebase용 클라우드 기능 - 이메일에 대한 작업 확인

이메일이 확인된 후에 실행될 클라우드 기능 트리거를 만들려고 합니다.

Cloud Functions 샘플에서 트리거에 대한 예제만 찾을 수 있었습니다.onCreate그리고.onDelete.

설명서에서 사용자 지정 작업 핸들러를 만드는 방법에 대해 찾았지만 기본적으로 기본적으로 제공되는 표준 전자 메일 확인 대화 상자를 대체하지 않고 전자 메일이 확인된 후 "사용자"의 속성만 변경하려고 합니다.

이것에 대한 경험이 있는 사람이 있습니까, 그리고 이것이 가능합니까?또는 사용자 지정 확인 보기/대화 상자 웹 페이지를 만들 수 있는 유일한 옵션입니까?

저는 이 문제에 직면했고 해결 방법을 찾는 데 오랜 시간이 걸렸기 때문에 이것이 이 문제에 휘말릴 수 있는 모든 사람에게 도움이 되기를 바랍니다.

1 -> 새 사용자를 위해 onCreate()로 트리거된 함수를 만들었습니다.

exports.sendConfirmationEmail = functions.auth.user()
                    .onCreate((user) => {
                        const actionCodeSettings = {
                            url: 'https://appNextURL.com/',
                            handleCodeInApp: false//ensure that the link will open into browser
                        };
                        return admin.auth().generateEmailVerificationLink(user.email, actionCodeSettings)
                            .then(async (link) => {
                                await db.collection('users').doc(user.uid).set({
                                    verificationLink: link,
                                    emailVerified: false
                                }, {merge: true});
                                return sendCustomVerificationEmail(user.email, user.displayName, link);
                            })
                            .catch((err) => {
                                console.error("Error:", err);
                                return Promise.reject(err);
                            });
                    });
  • 전자 메일 생성VERificationLink()는 3단계에서 저장할 링크를 기반으로 링크를 생성합니다.

  • sendCustomVerificationEmail() 함수는 표준 전자 메일 Firebase 전송을 초과하는 내부 함수일 뿐입니다.

2 -> 그런 다음 자동 메일을 보낼 때 파이어베이스에서 자동으로 생성되는 데이터로 수동 http 트리거를 수신하는 기능을 만들었습니다.

exports.verifyEmail = functions.https.onRequest((req, res) => {
                        const {mode, oobCode, apiKey, continueUrl, lang} = req.query;
                        const link = "https://us-central1-projectId.cloudfunctions.net/verifyEmail/?mode=" + encodeURIComponent(mode) + "&oobCode=" + encodeURIComponent(oobCode) + "&apiKey=" + encodeURIComponent(apiKey) + "&continueUrl=" + encodeURIComponent(continueUrl) + "&lang=" + encodeURIComponent(lang);
                        return db.collection("users")
                            .where("verificationLink", "==", link)
                            .get()
                            .then(function (querySnapshot) {
                                querySnapshot.forEach(function (user) {
                                    const userData: UserData = user.data();
                                    console.log("email verified: ", userData.userId);
                                    return admin.auth().updateUser(userData.userId, {
                                        emailVerified: true
                                    }).then(function (userRecord) {
                                        return db.collection('users').doc(userData.userId).set({emailVerified: true}, {merge: true});
                                    });
                                });
                                return res.sendStatus(200).end();
                            }).catch(function (err) {
                                console.log("error:", err);
                                return res.sendStatus(403).end();
                            });
                    });
  • 링크를 onCreate()에 저장했으므로 이제 해당 링크를 쿼리하여 인증하는 사용자가 누구인지 확인할 수 있습니다.

3 -> 세 번째 단계는 Firebase Authentication 템플릿에 대한 링크를 두 번째 단계로 생성된 링크로 변경하는 것입니다.

인증>으로 이동합니다.템플릿:

  • 편집 아이콘 클릭 > 사용자 지정 작업 URL 클릭:

  • 내비게이션

  • 생성된 링크를 2단계에 붙여넣고 저장합니다.

  • 링크 저장

이제 자동으로 생성된 모든 링크는 2단계에서 생성한 기능을 수행하고 원하는 작업을 처리할 수 있습니다.

분명히 말씀드릴 수 있으면 좋겠습니다.

당신은 여전히 (적어도) 인터페이스가 있는 Android에서 검증 상태를 확인할 수 있습니다.UserInfo방법isEmailVerified()예: 성공적인 로그인 시 다른 확인 전자 메일을 보내기 위해 현재 사용자가 전자 메일 주소를 아직 확인하지 않은 경우 - 로그인 화면을 다시 표시합니다.클라이언트 라이브러리를 통해 직접 HTTP를 통해 클라우드 기능을 트리거하거나 Firebase의 값을 업데이트할 수 있습니다.이것은 다른 플랫폼 클라이언트에도 적용될 수 있으며, 여기서 확인 상태를 확인할 수 있습니다.

이는 전자 메일이 방금 확인되었을 때의 이벤트는 아니지만, 각 로그인 시도마다 확인 상태를 알고 있으며 이 값은 클라이언트 측에서만 관련이 있을 수 있습니다.

사용자가 클라우드 기능을 트리거하도록 게시 단추 만들기

auth.emailVerified에서 클라우드 기능을 즉시 실행하는 대신 사용자에게 http 클라우드 기능(user.uid 전달)을 실행하는 'Publish Profile' 버튼을 제공합니다.이 함수는 전달된 user.uid를 사용하여 사용자 인증을 검색합니다.

if user.uid & & auth.emailVerified

auth.emailVerified를 각 user.post 에 씁니다.

기본적으로 게시 문서 "post.emailVerified" 필드는 false로 시작하며 클라우드 함수의 adminFirestore를 통해 이외에는 쓸 수 없습니다.

언급URL : https://stackoverflow.com/questions/43503377/cloud-functions-for-firebase-action-on-email-verified

반응형