본문 바로가기
FireBase

Firebase - 파이어베이스로 트위터로그인

by 봄석 2019. 1. 8.

Firebase - 파이어베이스 트위터로그인

Firebase 콘솔에 내앱 추가하기

먼저 https://console.firebase.google.com/ Firebase 콘솔창에 접속해 

Project Overview오른쪽의 톱니바퀴를 눌러 

 프로젝트설정-> 앱추가 -> 패키지이름 입력 

->google-services.json 파일 다운로드하여 -> 안드로이드스튜디오 app 아래에 넣어주기



그리고 gradle.build(모듈)의 dependencies에 아래 내용을 추가합니다

dependencies {
      ...
 
    //Firebase
    implementation 'com.google.firebase:firebase-database:16.0.5'
    implementation 'com.google.firebase:firebase-auth:16.0.5'
    
}
apply plugin: "com.google.gms.google-services"
 


그리고 gradle.build(프로젝트)

buildscript {
    ext.kotlin_version = '1.3.11'
    ext.anko_version='0.10.5'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        ...
 
        classpath 'com.google.gms:google-services:4.2.0' // update version
 
    }
}
 
allprojects {
    repositories {
        ...
        maven{
            url "https://maven.google.com"
        }
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir

}




트위터 계정 연동

트위터 계정과 연동하기 위해 https://developer.twitter.com/apps 에 접속해 개발자 사이트로 이동합니다.


위 사이트로 들어가면 우선 create a developer account 를 클릭해 개발자 계정을 만들어줍니다.


계발자 계정을 생성하고 apps를 클릭하면 



위 사진처럼 create an app 버튼이 생기게 됩니다 . 클릭해 줍니다


빨갛게 되어있는 부분은 필수적으로 입력해주어야 하는 부분입니다 . 

AppName과 description을 입력해주고 WebsiteURL은 아무사이트나 입력해줍니다.


그리고 가장 중요한 부분은 Enable Sign Twitter 를 꼭 체크해줍니다


Callback URLs 부분에 입력할 내용은

Firebase 콘솔창을 켜줍니다.https://console.firebase.google.com/ 

콘솔창에서 Authentication ->로그인방법 -> Twitter 를 클릭해 사용설정 해주고 아래에 있는 

복사하기를 눌러  콜백 URL을 복사해줍니다.

https://chobeombook.firebaseapp.com/__/auth/handler

twittersdk://  두개를 입력해줍니다






아직 API 키와 API 비밀번호는 입력하지않고 잠시 기달립니다.

다시 창으로 Twitter Develper 창으로 돌아와  콜백 URL과 Tell us how.. 를 입력하고 Create 버튼을 눌러줍니다.


내 메뉴를 클릭하고 Apss 를 눌러주면 아래와 같은 창이 뜨게 되는데 

여기서 Keys and tokens를 눌러줍니다.



그렇게 되면 아래 사진처럼 API key와 secret 키를 볼수 있게됩니다.


위 두 키를 복사해 다시 파이어베이스 콘솔로 돌아와 아래 그림부분에 넣어주고 저장합니다.



그리고 

permissions에 들어가 Additional permmision에 체크를 해주어야 되는데 

활성화가 되어 있지 않습니다 . 느낌표를 확인해보면 


Private police(개인정보 정책)URL과 Terms of Service(이용약관)URL을 입력하여야 한다고 합니다.

두 부분을 다시 입력하고 Permission 에 들어가보면

활성화가 된 것을 볼수 있습니다

Requset email address from users를 체크하여 줍니다. 그리로 Save



안드로이드 프로젝트 라이브러리 설정

gradle.build(모듈 수준)의 dependencies에 아래 코드를 작성합니다.

 //twitter login

    implementation 'com.twitter.sdk.android:twitter:3.1.1'




res/values/string.xml

<resources>
    <string name="app_name">TwitterLogin</string>
....
    <string name="twitter_consumer_key">Tqn4YWKhsexg3Exhk------ </string>
    <string name="twitter_consumer_secret">PEcAbt0Q6bDVltUWXLhq2oEXhKgmPJ8c-------</string>
 

</resources>


MainActivity.kt

class MainActivity : AppCompatActivity() {
    lateinit var twitterAuthClient: TwitterAuthClient
    private lateinit var auth: FirebaseAuth
    var loginState = false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Configure Twitter SDK
        val authConfig = TwitterAuthConfig(
            getString(R.string.twitter_consumer_key),
            getString(R.string.twitter_consumer_secret)
        )
 
        val twitterConfig = TwitterConfig.Builder(this)
            .twitterAuthConfig(authConfig)
            .build()
 
        Twitter.initialize(twitterConfig )
        setContentView(R.layout.activity_main)
 
        auth = FirebaseAuth.getInstance()
 
        twitterAuthClient = TwitterAuthClient()
 
        twitterSignButton.setOnClickListener {
            if (!loginState) {
                twitterLogin()
            } else {
                loginState = !loginState
                twitterSignButton.text = "트위터로그인"
                signOut()
            }
        }
    }
 
    private fun twitterLogin() {
        twitterAuthClient?.authorize(this, object : Callback<TwitterSession>() {
            override fun success(result: Result<TwitterSession>?) {
                if (result != null) {
                    handleTwitterSession(result.data)
                    toast("트위터 로그인성공")
                    twitterSignButton.text = "로그아웃"
                    loginState = !loginState
                }
            }
 
            override fun failure(exception: TwitterException?) {
                toast("트위터 로그인실패")
            }
        })
    }
 
    private fun handleTwitterSession(session: TwitterSession) {
        Log.d("MainActivity", "handleTwitterSession:$session")
        val credential = TwitterAuthProvider.getCredential(
            session.authToken.token,
            session.authToken.secret
        )
 
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d("MainActivity", "signInWithCredential:success")
                    val user = auth.currentUser
                    loginInfo.text="id : ${user?.displayName}"
 
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w("MainActivity", "signInWithCredential:failure", task.exception)
                    toast("Authentication failed.")
                }
            }
    }
 
    private fun signOut() {
        auth.signOut()
        TwitterCore.getInstance().sessionManager.clearActiveSession()
        loginInfo.text="info"
 
    }
 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        twitterAuthClient?.onActivityResult(requestCode, resultCode, data)
    }
 
    public override fun onStart() {
        super.onStart()
        val currentUser = auth.currentUser
        loginInfo.text=currentUser?.displayName
    }

}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" tools:layout_editor_absoluteY="81dp">
 
    <Button
            android:text="트위터로그인"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/twitterSignButton"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>
    <TextView
            android:text="signOut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/loginInfo" android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:layout_marginTop="46dp"
            app:layout_constraintTop_toBottomOf="@+id/twitterSignButton" android:layout_marginEnd="12dp"
            app:layout_constraintEnd_toEndOf="@+id/twitterSignButton"/>
</android.support.constraint.ConstraintLayout>




댓글