Demo
오늘은 구글 로그인 연결과 관련해서 만들어본 내용을 정리해본다.
(서버 없이) 파이어베이스를 이용해서 구글 로그인을 하고자 한다면,
파이어베이스 콘솔을 등록하고, 1. GoogleService-Info.plist 파일 추가와 2.Authentication 탭에서 구글을 활성화 3. 프로젝트에 구글 로그인 설치를 해야한다.
콘솔 등록을 완료하면, plist 파일을 다운 받을 수 있다. 이 파일은 프로젝트의 상단에 위치시켜주자.
파일 업로드를 완료하였으면, REVERSED_CLIENT_ID 값을 URL Type schema 에 붙여넣어주자.
이 작업은, 구글이 권한을 위임할 앱을 구분하기 위해서 설정해주는 작업으로 각 앱 서비스(e.x. 페이스북, 트위터 등)마다 모든 다른 값을 가지고 있다.
그리고, 다시 파이어베이스 콘솔로 돌아가 설정하면 기본 셋팅은 어느정도 끝난다.
파이어베이스를 통해 인증을 구현할 경우 다음과 같은 특징을 가질 수 있다.
- SignIn 기능을 쉽게 제공
- dependency를 통해 쉽게 설치 및 구현 가능!!
- OAuth 2.0 / Open ID Connect 등의 업계 표준 활용, 삽입형 인증 솔루션 제공
- 다양한 인증방식 제공 : 이메일/비번, ID 공급업체(facebook .. ), 전화번호, 커스텀인증, 익명인증
- 별도의 backend 개발 없이 인증 서비스 제공
- serverless framework
그럼 이제 내 프로젝트로 다시 돌아와 파이어베이스와 구글 로그인을 설치해주자. 코코아팟부터 천천히 설치하면 된다.
pod 'Firebase/Auth'
pod 'GoogleSignIn'
AppDelegate.swift
델리게이트 설정을 해준다. 파이어베이스를 넣어주고, 구글 로그인 관련 핸들러를 설정해준다.
이 작업은, 앱이 시작될 때 파이어베이스도 함께 연결이 될 수 있도록 해주고 인증 과정에서 구글 로그인 요청이 왔을 때 설정해주는 부분이다.
import Firebase
import GoogleSignIn
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
return true
}
// google login handler
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
var handled: Bool
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
return true
}
return false
}
..
}
GoogleSignIn 라이브러리를 설치하면, 사실 구글이 이쁜 로그인 버튼을 제공한다. (문서)
이 버튼을 사용해서 구현할 경우, 쉽게 인증 정보를 전달 할 수 있다.
하지만, 나의 경우 그냥 내가 만든 버튼에 로그인을 하고 싶어서... (내 기준 안이뻐서..ㅋㅋㅋ) googleLoginButton을 하나 만들어주고, 다음과 같이 작업 하였다.
@IBAction func tapGoogleLoginButton(sender: Any) {
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
let signInConfig = GIDConfiguration.init(clientID: clientID)
GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
guard error == nil else { return }
guard let authentication = user?.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken!, accessToken: authentication.accessToken)
// access token 부여 받음
// 파베 인증정보 등록
Auth.auth().signIn(with: credential) {_,_ in
// token을 넘겨주면, 성공했는지 안했는지에 대한 result값과 error값을 넘겨줌
self.showMainViewController()
}
}
}
코드 한 줄씩 이해해보면 다음과 같다.
1. 파이어베이스의 인증 정보를 가져와
2. 구글 로그인을 시도하기 위해 셋팅해준다.
3. 구글 로그인을 시도하는데, 시도 결과에 따라 각각 처리해준다.
3-1. 실패 할 경우 return
3-2. 성공 할 경우 구글 로그인 정보(access token)을 가져와, 파이어베이스에 로그인을 시도한다.
음.. 파이어베이스에 구글 로그인을 연결해 놨는데, 왜 구글 로그인 값을 파이어베이스에다가 넘겨줘야하지? 하는 의문이 생길 수 있다.
- GoogleSignIn 객체를 통해 로그인 시도한 것은 구글의 OAuth 서비스를 이용해서 권한을 위임 받은 행위 이고,
- Auth.auth().sigIn 메소드를 통해 로그인 시도한 것은 별도의 서버 없이 간편하게 구현하기 위해 파이어베이스를 사용하기로 하였으니, 파이어베이스(내 서버)에 구글로부터 위임 받은 인증키를 넘겨주는 작업이다.
다시 정리하면, 다음과 같다.
- 기본 개념
- User service Provider에 계정을 가지고 잇는 사용자
- Consumer Serivce Provider의 API(제공기능)를 사용하려는 서비스 (앱, 웹 등)
- Service Provider OAuth를 사용하여 API 제공하는 서비스
- Access Token 인증 완료 후 Service Provider의 제공 기능을 이용할 수 있는 권한을 위임 받은 인증키
- User <-> Consumer : google로 로그인하기
- User가 Consumer인 앱을 통해 로그인 요청
- Consumer <-> Serivce Provider: Request Token
- 이 앱의 서버가 구글 로그인 권한을 요청
- User <-> Serivce Provider: 권한 위임 확인 요청
- 계정에 액세스 하려고 할 때 확인 받는 거
- User <-> Serivce Provider: 권한 위임 승인
- Consumer <-> Serivce Provider: Access Token
- google이 가지고 있는 권한을 위임한 토큰 전달
- User <-> Consumer: 로그인 완료
이것이 OAuth의 기본 개념이고, 이를 활용해서 구글, 애플 등 여러 서비스의 로그인 기능을 제공할 수 있다는 걸 확인 하였다. 다음에는 구글 말고 다른 서비스 로그인을 한번 해봐야겟다.
--
로그인-로그아웃, 그리고 프로젝트의 UI 등 자세히 보고 싶은 경우 아래 레포를 통해 확인 할 수 있다.
https://github.com/doitduri/UIKit-Training/tree/main/SopotifyLoginSampleApp
** 이 글은 아래 문서를 기준으로 작성하였습니다.
https://developers.google.com/identity/sign-in/ios/start
https://firebase.google.com/docs/auth/ios/google-signin?hl=ko
'✏️ > iOS&Swift' 카테고리의 다른 글
[iOS] RxSwift Repository pattern - overall (0) | 2021.12.06 |
---|---|
[iOS] 내 프로젝트에 파이어베이스를 이용해서 Apple Login 붙이기 (0) | 2021.09.30 |
[iOS] Life-cycle (0) | 2021.09.08 |
[iOS] UIKit-Training/QuoteGenerator (0) | 2021.09.07 |
[iOS][Swift] Stanford 2021 CS193p class Notes (0) | 2021.08.23 |