🚨 GoogleService-Info.plist를 추가하기 전에 원격저장소(Github)에 프로젝트를 업로드한다면 제거하고 올리는 것을 권장 (개인정보 유출 가능성이 있습니다.)
pod 'Firebase/Auth'
- CocoaPods전화번호 인증을 사용하려면 Firebase에서 전화번호 로그인 요청이 내 앱에서 발생한 것인지 확인할 수 있어야 합니다.
Silent APN 알림
: 기기에서 처음으로 전화번호를 통해 사용자를 로그인 처리하면 Firebase 인증에서 사용자 모르게 기기로 푸시 알림을 전송하여 토큰을 보냅니다.reCAPTCHA 인증
: 사용자가 앱의 백그라운드 새로고침을 중지했거나 iOS 시뮬레이터에서 앱을 테스트하는 경우와 같이 자동 푸시 알림을 주고받을 수 없는 경우, Firebase 인증은 reCAPTCHA 인증을 사용하여 전화번호 로그인 과정을 완료합니다.사용자에게 전화번호를 제공하도록 요청하는 UI를 작성한 후, verifyPhoneNumber:UIDelegate:completion:
를 호출하여 Firebase가 사용자의 전화에 SMS로 인증 코드를 전송하도록 요청합니다.
var phoneNumber = "123-456-789" // 전화번호
PhoneAuthProvider.provider()
.verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
if let error = error {
self.showMessagePrompt(error.localizedDescription)
return
}
// 에러가 없다면 사용자에게 인증코드와 verificationID(인증ID) 전달
}
verifyPhoneNumber:UIDelegate:completion:
가 호출하면 Firebase가 앱에 사용자 모르게 푸시 알림을 보내거나 사용자에게 reCAPTCHA 챌린지를 표시합니다.languageCode
속성을 사용하여 인증언어를 지정하면 SMS메시지를 현지화할 수 있습니다.Auth.auth().languageCode = "kr"
권장사항
- 지역마다 법에따라 다르지만, 일반적으로 사용자에게 SMS메시지가 발송되고 요금이 발생할 수 있다는 점을 알려야 합니다.
정상적으로 인증코드와 인증ID를 받았다면 signInWithCredential:completion:
를 호출하여 FIRPhoneAuthCredential
객체를 만든 후 사용자로그인합니다.
FIRPhoneAuthCredential
객체 생성let credential = PhoneAuthProvider.provider().credential(
withVerificationID: verificationID,
verificationCode: verificationCode
)
FIRPhoneAuthCredential
객체를 사용하여 로그인Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
print(error.debugDescription)
}
// 인증 완료 -> 로그인 진행
}
가상전화번호로 테스트 장점
가상전화번호를 위한 요구사항
Console에서 Authetication섹션에서 Sign in method탭에서 전화번호를 제공합니다.
로그인이 완료되면 해당전화번호로 Firebase사용자가 생성됩니다.
사용자는 실제 전화번호 사용자와 동일한 행동 및 속성을 가지며 동일한 방식으로 실시간 데이터베이스/Cloud Firestore 및 기타 서비스에 액세스할 수 있습니다. 이 과정에서 생성된 ID 토큰은 실제 전화번호 사용자와 동일한 서명을 갖습니다.
Control Access with Custom Claims and Security Rules - Firebase Admin SDK는 사용자계정 커스텀을 지원합니다.
Firebase Authentication
는 수동으로 테스트를 진행하는 경우, reCAPTCHA인증 및 silent push notifications를 무시하고 진행할 수 있습니다.appVerificationDisabledForTesting
값을 TRUE로 설정
가상전화번호만 사용할 수 있습니다.
let phoneNumber = "+15605551342"
let testVerificationCode = "220118"
Auth.auth().settings?.isAppVerificationDisabledForTesting = true
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
(verificationID, error) in
if error != nil {
print("인증Error: \(error.debugDescription)")
return
}
let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
verificationCode: testVerificationCode)
Auth.auth().signIn(with: credential) { (authData, error) in
if error != nil {
print("로그인Error: \(error.debugDescription)")
return
}
print("authData: \(authData)")
}
}
🚨 Capability에서 Background Modes에 Remote notifications가 체크되어 있으면 에러가 발생함
Swizzling이란? 런타임때 어떤 메서드를 다른 메서드로 바꾸는 것을 말합니다.
Firebase가 silent push notification으로 APNs 토큰을 얻거나, reCAPTCHA 지정한 custom scheme으로 리다이렉트를 하는 과정에서 Swizzling을 합니다.
Swizzling 비활성화
FirebaseAppDelegateProxyEnabled
속성울 추가한 후 No로 설정합니다. (Firebase 모든 products에서 swizzling 비활성화) ****APNs device token 얻기
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// 디바이스토큰을 auth에 전달
Auth.auth().setAPNSToken(deviceToken, type: .prod)
// 앱에서 필요한 경우 디바이스토큰 추가 처리
// ...
}
redirect URL
// AppDelegate.swift
// iOS 9이상
func application(_ application: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
if Auth.auth().canHandle(url) {
return true
}
}
// iOS 9미만
func application(_ application: UIApplication,
open url: URL,
sourceApplication: String?,
annotation: Any) -> Bool {
if Auth.auth().canHandle(url) {
return true
}
}
// SceneDelegate.swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for urlContext in URLContexts {
let url = urlContext.url
Auth.auth().canHandle(url)
}
}
auth
변수에서 로그인한 사용자의 고유 사용자 ID를 가져와 사용자가 액세스할 수 있는 데이터를 제어할 수 있습니다.로그아웃
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
} catch let signOutError as NSError {
print("Error signing out: %@", signOutError)
}
vs
Authorization vs
Certification