C#/ASP.NET Core

[Asp.net core] Firebase link 생성하고 이메일로 전송

말하는 닭 2023. 5. 6. 16:50

비밀번호를 잊어버리거나 비밀번호를 잊어버리면 바꿔줘야 한다. 

내가 만들고 있던 거에는 Firebase로 로그인을 했기 때문에 Firebase의 비밀번호 변경 이메일을 전송하려고 한다. 

출처: https://firebase.google.com/docs/auth/admin/email-action-links?hl=ko

firebase문서에서는 다음과 같이 안내하고 있다. 

그런데 흠.. 아직도 actionCodeSettings가 뭔지는 잘 모르겠다. 

 

이메일 보내는 거는 그냥 이전 글에서 쓴 방법대로 그대로 가져왔다. 

링크 생성은 위의 사진대로 GeneratePasswordResetLinkAsync 메서드를 사용하면 된다. (await 안 써주면 링크가 이상한 거로 만들어진다)

var link = await FirebaseAuth.DefaultInstance.GeneratePasswordResetLinkAsync(email);

MailMessage message = new MailMessage {
    From = new MailAddress("inhu.app.manager@gmail.com"),
    Subject = "Inhu.kr의 비밀번호 변경",
    Body = $"안녕하세요.<br/><br/>" +
        "다음 링크를 통해 비밀번호를 변경하세요<br/><br/>" +
        $"{link}<br/><br/>" +
        "비밀번호 변경을 요청하지 않았다면, 이 이메일을 무시하셔도 됩니다.<br/>" +
        "감사합니다.",
    IsBodyHtml = true,
    DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure,
    SubjectEncoding = Encoding.UTF8,
    BodyEncoding = Encoding.UTF8
};
message.To.Add(new MailAddress(email));

using(SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587)) {
    smtp.Timeout = 5000;
    smtp.UseDefaultCredentials = false;
    smtp.EnableSsl = true;
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
    smtp.Credentials = new System.Net.NetworkCredential(MailAddress, AppPassword);

    try {
        smtp.Send(message);
        message.Dispose();
    }
    catch {
        ModelState.AddModelError("Error", "발송에 실패하였습니다. 나중에 다시 시도하십시오");
    }
}

코드 복-붙 (자세한 내용은 이쪽에서 -> https://chicken1910.tistory.com/27)

 

이렇게 작성하면 메일이 잘 날라온다.

네이버로 해도 잘 온다.

링크를 따라 들어가면 비밀번호를 바꿀 수 있는 창이 나타난다.

새 비밀번호를 적어주고 저장하면 알아서 비밀번호를 바꿔준다.

 

여담으로 이전 글에서 사용자를 생성할 때 비밀번호를 Bcrypt로 해시해서 저장을 시키고, 로그인 시 비밀번호의 해시값을 넘겨서  비교했는데... 이러니까 재설정된 비밀번호는 평문이고, 로그인하려고 전달하는 비밀번호는 해시된 값이여서 둘이 다르다고 로그인을 안 시켜줬었다.. 

 

 

이 글에서는 비밀번호 재설정을 할 수 있는 코드를 올렸는데, 

비밀번호 재설정 말고도

 

이메일 확인의 경우

var link = await FirebaseAuth.DefaultInstance.GenerateEmailVerificationLinkAsync(email);

로그인의 경우

var link = await FirebaseAuth.DefaultInstance.GenerateSignInWithEmailLinkAsync(email, actionCodeSetting);

과 같이 2개 더 있긴 하다. 그런데 로그인은 나머지와 달리 ActionCodeSetting의 매개변수가 하나 더 필요하다. 얘는 뭔지 잘 몰라서... 패스...

 

참고로 Gamil SMTP를 이용하는데 있어서 제한이 있다. 하루 200통까지만 보낼 수 있다던가? 정확한 수는 기억이 나지 않지만.