Swuft Login With Firebase
화면 디자인
페이스북에서 API KEY를 발급받는 내용은 생략
사용할 모듈
Podfile
pod 'Firebase/Core'pod 'Firebase/Auth'pod 'Firebase/Database'pod 'Firebase/Storage'pod 'FBSDKLoginKit' //페북 로그인을 위한 pod//스위프트 키체인 랩퍼는 로그인에 성공한 토큰값을 스마트폰에 저장해야 다시 로그인 없이 접근할 수 있는데//이때 키값 보안에 이슈가 있어 암호화 저장하는 모듈이다.pod 'SwiftKeychainWrapper'
뷰컨트롤러
class : UIViewController {//아이디와 이메일의 값을 받는다@IBOutlet weak var : FancyField!@IBOutlet weak var : FancyField!override func viewDidLoad() {super.viewDidLoad()}//페이스북 로그인 버튼을 눌렀을때@IBAction func facebookBtnTapped(_ : AnyObject) {//페이스북 로그인 매니저를 로드let facebookLogin = FBSDKLoginManager()//페이스북 로그인을 시도 요청하는 접그facebookLogin.logIn(: ["email"], : self) { (result, error) inif error != nil {print("error: 로그인 실패 \(error)")} else if result?.isCancelled == true {//사용자가 취소한경우print("사용자 로그인 취소")} else {print("로그인 성공")//로그인에 성공하게 되면 리턴값을 받아온다.let credential = FIRFacebookAuthProvider.credential(: FBSDKAccessToken.current().tokenString)//firebaseAuth 함수는 바로 하단에self.firebaseAuth(credential)}}}//페이스북으로부터 인증받은 내용을 인자값으로 받아 파이어베이스에 넣는 함수func firebaseAuth(_ : FIRAuthCredential) {//페이어베이스 Auth에 데이터를 전달FIRAuth.auth()?.signIn(: credential, : { (user, error) inif error != nil {print("파이어베이스 로그인 실패")} else {print("파이어베이스 로그인 성공")유저가 있으면 로그인 완료 함수로 넘기기 바로 하단에if let user = user {self.completeSignIn(: user.uid)}}})}func completeSignIn(: String) {//키체인 래퍼로 받은 값을 KEY_UID로 설정let keychainResult = KeychainWrapper.setString(id, : KEY_UID)//로그인이 완료 됬으니 세그이동performSegue(: "goToFeed", : nil)}//이메일 로그인을 하는경우@IBAction func signInTapped(_ : AnyObject) {//비밀번호와 아이디값 읽어보기if let email = emailField.text, let pwd = pwdField.text {//이전에 입력한 이메일이 아닌 경우 로그인처리FIRAuth.auth()?.signIn(: email, : pwd, : { (user, error) inif error == nil {print("JESS: Email user authenticated with Firebase")if let user = user {self.completeSignIn(: user.uid)}} else {//처음유저의 경우 createUser를 통해 계정생성FIRAuth.auth()?.createUser(: email, : pwd, : { (user, error) inif error != nil {print("JESS: Unable to authenticate with Firebase using email")} else {print("JESS: Successfully authenticated with Firebase")if let user = user {self.completeSignIn(: user.uid)}}})}})}}}
위처럼 한번 로그인을 할경우 계속해서 로그인을 하지않도록 구현을 해보자
//뷰가 로드된 후 실행override func viewDidAppear(_ : Bool) {//keyChain값이 있는지 확인 후 있다면if let _ = KeychainWrapper.stringForKey(KEY_UID) {print("JESS: ID found in keychain")//로그인 실행performSegue(: "goToFeed", : nil)}}