Firebase Authentication에서 Twitter OAuth를 사용하여 Twitter API에 요청

2018년 5월 TwitterKit 지원 종료 그리고 Firebase Authentication에서도 OAuth를 이용한 Twitter 로그인이 권장됩니다.
설정 주위에 관해서는 이미 몇개의 기사가 있으므로, 주로 iOS/Swift에서의 구현 부분에 대해서 쓰고 싶습니다.

그래서 바로 만들어 봅시다 👨‍🍳🐟

환경


  • iOS 11.0 ~
  • Swift 5
  • FirebaseAuth
  • OAuthSwift
  • KeychainAccess

  • Twitter 개발자 계정 등록



    Twitter API 등록(계정 신청 방법)으로부터 승인될 때까지의 순서 정리※2019년 8월 시점의 정보
    이쪽이 매우 참고가 됩니다 💁‍♀️

    Firebase Authentication 설정



    이번까지는 공식 문서 를 보면 특히 헤매지 않고 구현할 수 있다고 생각합니다💁‍♂️



    Firebase Cloud Messaging에서 메소드 구현 교체을 사용하지 않도록 설정하는 경우 설정에 주의해야 합니다.
    인증 후 SafariViewController가 닫히지 않고 로그인에 실패합니다.
    Info.plist에서 FirebaseAppDelegateProxyEnabled를 설정한 경우 값을 YES로 설정해야 합니다.

    또한 UIWindowSceneDelegate 가 구현된 경우에도 위와 유사한 현상이 발생할 수 있습니다.
    그 경우는 다음을 해 봅시다.
    1. SceneDelegate.swiftをProjectから削除
    2. AppDelegate内の関連する箇所でエラーが出るのでコードを削除
    3. Info.plistのApplication Scene Manifestを削除
    4. AppDelegateのプロパティにUIWindowを追加
    

    FirebaseAuth에서 OAuth 인증 구현



    거칠게 다음과 같은 처리가 됩니다(에러 처리 등은 생략하고 있습니다)
    취득한 AccessToken과 Secret은 우선 Keychain에 등록하고 있습니다.
    class Login {
        private var provider: OAuthProvider?
    
        func signinByTwitter() {
            provider = OAuthProvider(providerID: "twitter.com")
            provider?.getCredentialWith(nil) { credential, error in
                guard let credential = credential, error == nil else {
                    return
                }
    
                Auth.auth().signIn(with: credential) { result, error in
                    guard error == nil else {
                        return
                    }
    
                    if let credential = result?.credential as? OAuthCredential,
                        let accessToken = credential.accessToken,
                        let secret = credential.secret {
    
                        let keychain = Keychain(service: Bundle.main.bundleIdentifier!)
                        try? keychain.set(accessToken, key: "accessTokenKey")
                        try? keychain.set(secret, key: "accessTokenSecretKey")
                    }
                }
            }
        }
    }
    

    구현에서도 일점 조심하는 일이 있어, OAuthProvider 를 클래스의 프로퍼티등 참조가 보관 유지되는 형태로 가져 둘 필요가 있습니다.
    OAuthProvider가 해제되면 내부적으로 메서드가 호출되지 않고 인증을위한 SafariViewController가 표시되지 않습니다.

    OAuthSwift로 API에 요청



    Firebase에서 OAuth의 AccessToken과 Secret을 이미 취득했으므로 Twitter의 API 요청에는 OAuthSwiftClient를 사용하고 있습니다.ConsumerKey 또는 ConsumerKeySecret 는 개발자 사이트에서 가져옵니다.
    이번에는 설정 정보에서 표시 이름을 가져오기로 합니다.
    struct TwitterSetting: Decodable {
        let screenName: String
    
        enum CodingKeys: String, CodingKey {
            case screenName = "screen_name"
        }
    }
    
    class TwitterDataStore {
        func fetchSettings() {
            let consumerKey = "ConsumerKey"
            let consumerKeySecret = "ConsumerKeySecret"
            let keychain = Keychain(service: Bundle.main.bundleIdentifier!)
    
            guard let accessToken = try? keychain.get("accessTokenKey"),
                let accessTokenSecret = try? keychain.get("
    accessTokenSecretKey"),
                let url = URL(string: "https://api.twitter.com/1.1/account/settings.json") else {
                return
            }
    
            let client = OAuthSwiftClient(
                consumerKey: consumerKey,
                consumerSecret: consumerKeySecret,
                oauthToken: accessToken,
                oauthTokenSecret: accessTokenSecret,
                version: .oauth1
            )
    
            client.get(url) { result in
                switch result {
                case .success(let response):
                    guard let setting = try? JSONDecoder().decode(TwitterSetting.self, from: response.data) else {
                        return
                    }
    
                    print(setting)
    
                case .failure:
                    break
                }
            }
        }
    }
    

    이제 표시 이름이 표시되어야합니다 ✌️

    좋은 웹페이지 즐겨찾기