기본 콘텐츠로 건너뛰기

안드로이드 앱 만들기 : 소셜 로그인#2 (facebook 로그인)


원본출처: 티스토리 바로가기

소셜로그인

지난번 이야기는 미리 보고 오시면 도움이 됩니다.

 

https://billcorea.tistory.com/308

 

안드로이드 앱 만들기 : 소셜 로그인 ( 네이버, 카카오톡, 구글) 구현해 보기

소셜로그인 요새는 대부분의 사용자들이 이런저런 SNS 등에 가입이 되어 있기 때문에 또 다른 개인정보를 제공해 가면서 로그인을 하려고 하지 않습니다. 또한 각각에 등록된 비밀번호를 기억하

billcorea.tistory.com

 

Facebook Login

이번에는 Facebook으로 firebase에 로그인하는 과정을 만들어 보겠습니다. 

facebook_03.svg
0.01MB

이미지 버튼 아이콘을 만들기 위한 svg 이미지 입니다.  다른 방법도 있기는 하겠지만, 저는 이미지 버튼으로 구현을 할 생각이기 때문에 간단한 이미지를 만들어 보았습니다. 

 

facebook 로그인을 하려면 해야할 일이 먼저 facebook 개발자 계정을 만들어야 하고 해당 계정에 필요한 앱을 등록해야 합니다.   아래 그림과 같이 facebook 개발자 페이지에서 등록한 앱의 정보와 firebase 인증 설정에서 연결해야 하는 부분을 기술해 보았으니 참고해 보세요.

 

개발자 페이지 연결정보

Facebook 개발자페이지 앱정보

설정 - 기본설정 에서 앱 ID 와 앱 시크릿코드 가 있어야 firebase 인증 정보에 등록을 할 수 있습니다. 

 

Firebase Authentication 정보

sign-in method 에서 facebook을 선택하고 등록하는 창을 열어서 OAuth 리다이렉션 URI을 복사해서 facebook 개발자 페이지의 Facebook 로그인 설정의 유효한 OAuth 리다이렉션 URI에 붙여 넣기를 해 주어야 합니다.

 

여기까지가 해야 개발자 페이지 및 인증 설정이 마무리 됩니다.

 

이제 만들던 android 앱을 구현해 보겠습니다. 

 

gradle 파일에는 아래와 같이 추가되어 있어야 합니다.

    // firebase 연동 처리용     implementation platform('com.google.firebase:firebase-bom:31.1.1')     implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'          //facebook login     implementation 'com.facebook.android:facebook-login:15.0.0'

 

다음은 manifest 파일을 살펴보겠습니다.   facebook 개발자 페이지의 가이드에 따라 아래와 같이 구성이 되어야 합니다.

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools">      <uses-permission android:name="android.permission.INTERNET" />     // facebook     <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>  	// facebook     <queries>         <provider android:authorities="com.facebook.katana.provider.PlatformProvider" />     </queries>      <application         android:name=".viewModel.MyApplication"        ...         tools:targetApi="31">  		// facebook         <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>         <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>           <activity             android:name=".MainActivity"             android:exported="true"             android:theme="@style/Theme.RemotePayment0119">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>  		// facebook          <activity android:name="com.facebook.FacebookActivity"             android:configChanges=                 "keyboard|keyboardHidden|screenLayout|screenSize|orientation" />         <activity             android:name="com.facebook.CustomTabActivity"             android:exported="true">             <intent-filter>                 <action android:name="android.intent.action.VIEW" />                 <category android:name="android.intent.category.DEFAULT" />                 <category android:name="android.intent.category.BROWSABLE" />                 <data android:scheme="@string/fb_login_protocol_scheme" />             </intent-filter>         </activity>      </application>  </manifest>

 

이제 acitivity의 구현을 따라가 보겠습니다. 

 import android.app.Activity ...  class MainActivity : ComponentActivity() {      ...      private val TAG = "---"  	// facebook     val callbackManager = CallbackManager.Factory.create()     val loginManager = LoginManager.getInstance()      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)          ...          setContent {              val scrollableState = rememberScrollState()              RemotePayment0119Theme {                 // A surface container using the 'background' color from the theme                 Column(                     modifier = Modifier                         .fillMaxSize()                         .padding(30.dp)                         .verticalScroll(scrollableState),                     horizontalAlignment = Alignment.CenterHorizontally,                     verticalArrangement = Arrangement.Center                 ) {                     DestinationsNavHost(navGraph = NavGraphs.root) {                         ...                         composable(LoginOptionsDestination) {                             LoginOptions(                                 ...                                 doFacebookLogin = {                                     doFacebookLogin()                                 },                                 ...                             )                         }                     }                 }             }         }     }      private fun doFacebookLogin() {         loginManager.logIn(this@MainActivity, callbackManager, listOf("email", "public_profile","openid"))         loginManager.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {             override fun onCancel() {                 Log.e("", "onCancel")                 loginManager.logOut()             }              override fun onError(error: FacebookException) {                 Log.e("", "error=${error.localizedMessage}")             }              override fun onSuccess(result: LoginResult) {                 Log.e("", "accessToken Removed authToken=${result.authenticationToken}")                 handleFacebookAccessToken(result.accessToken)             }         })      }      private fun handleFacebookAccessToken(token: AccessToken) {         Log.e(TAG, "handleFacebookAccessToken:$token")          val credential = FacebookAuthProvider.getCredential(token.token)         auth.signInWithCredential(credential)             .addOnCompleteListener(this) { task ->                 if (task.isSuccessful) {                     // Sign in success, update UI with the signed-in user's information                     Log.e(TAG, "signInWithCredential:success")                     val user = auth.currentUser //                    updateUI(user)                 } else {                     // If sign in fails, display a message to the user.                     Log.e(TAG, "signInWithCredential:failure", task.exception)                     Toast.makeText(baseContext, "Authentication failed.",                         Toast.LENGTH_SHORT).show() //                    updateUI(null)                 }             }     }       ...      fun printHashKey(context: Context): String {          val TAG = "HASH_KEY"         var hashKey : String? = null         try {             val info : PackageInfo = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES)             for (signature in info.signatures) {                 var md : MessageDigest = MessageDigest.getInstance("SHA")                 md.update(signature.toByteArray())                 hashKey = String(Base64.encode(md.digest(), 0))                 Log.e(TAG, "hashKey=$hashKey")             }          } catch (e:Exception){             Log.e(TAG, e.toString())         }          return "$hashKey"      } }  @Preview(showBackground = true) @Composable fun DefaultPreview() {     RemotePayment0119Theme {         DestinationsNavHost(navGraph = NavGraphs.root)     } }

callBackmanager을 선언한 다음,  loginManager에 callback을 등록해 줍니다. 다음은 loginManager에서 callback 이 돌아왔을 때 처리할 부분을 등록해 주면 됩니다. 

 

handleFacebookAccessToken 함수는 firebase 개발자 가이드에서 설명하고 있는 부분입니다. 저 함수를 호출하는 것으로 firebase에 로그인은 바로 처리됩니다. 이미 등록된 이메일이라면 로그인이 되고 그렇지 않은 경우는 자동으로 사용자 등록을 해 줍니다. 

 

주의할 점

  • facebook에서 돌아오는 accessToken 은 logger cat에 표시되지 않습니다. 로그를 찍어 보면 AccessToken Removed라고 표시되기 때문에 초심자의 경우 헤맬 수 있습니다. 
  • handleFacebookAccessToken 함수에서는 facebook 계정의 이메일을 이용하기 때문에 다른 방법으로 이미 동일한 이메일이 등록되어 있다면 사용할 수 없습니다. 구글 로그인이나, 이메일 로그인을 통해서 이미 가입된 이메일 여부를 확인해 주어야 합니다. 
  • 인증에 대한 부분만 기술하였기 때문에 회원 등록등을 하기 위해서는 정보 수집에 관한 구현은 따로 진행되어야 합니다. 
  • 기능 사용을 위해서는. Facebook 개발자 계정에서 해당 앱에 대한 인증을 진행해야 합니다.

 

이 두 가지만 주의한다면 허송세월하는 일 없이 구현을 해 볼 수 있을 것 같습니다.  카카오나 네이버를 통한 로그인 계정 구현처럼 서버 리스를 구현하지 않아도 되니 구글 로그인 보다 더 수월하게 해 볼 수 있습니다. 

 

 

 

로그인 예시

 

이제 Facebook 계정을 통한 로그인이 해 볼 수 있겠습니다.

 

 

전체 소스는 아래 github 에서 참고 하세요.

https://github.com/nari4169/RemotePayment0119

 

쿠팡링크 쿠팡와우 쿠팡남성패션 쿠팡여성패션
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글

이 블로그의 인기 게시물

안드로이드 앱 만들기 : onBackPressed 가 deprecated 되었다니 ?

원본출처: 티스토리 바로가기 onBackPressed 가 deprecated 되었다? 이제 우리는 구글이 제안하는 안드로이드 13에 타기팅하는 앱을 제출 해야만 하는 시기에 도달하고 있습니다.  구글이 새로운 안드로이드 버전을 배포하기 시작하면서 오래된 안드로이드에 대한 게시를 제한 합니다.    그래서 이번에 API 33 인 안드로이드 13에 타겟팅 하는 앱을 작성해 보았습니다. 그러다 만난 몇 가지 사용 제한이 되는 것들에 대한 정리를 해 두고자 합니다.    onBackPressed는 사용자가 뒤로 가기 버튼을 클릭하는 경우 제어를 하기 위해서 사용했던 함수 입니다. MainActivity 에서 최종적으로 뒤로 가기를 클릭 하는 경우 앱을 종료시키는 기능도 사용이 되는 함수였는 데...   안드로이드 13에서는 더 이상 사용할 수 없는 (?)  - 사용은 가능 하나 소스 코드에 중간 줄이 생긴 모양을 보면서 코드를 지속적으로 봐야 합니다.    onBackPressed 어떻게 해소를 하면 될까요?   CallBack을 하나 만들어 봅니다. private val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { doCloseApps() } } 다른 건 없고 이런 모양으로 callback 함수를 하나 만들어 둡니다.  그러고 onCreate 에서 이 callback 이 호출 되도록 한 줄 넣어 주는 것으로 그 코딩은 마무리 됩니다.    @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(sav...

개인정보처리방침 안내

 billcoreaTech('https://billcoreatech.blogspot.com/'이하 'https://billcoreatech.blogspot')은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다. ○ 이 개인정보처리방침은 2021년 8월 26부터 적용됩니다. 제1조(개인정보의 처리 목적) billcoreaTech('https://billcoreatech.blogspot.com/'이하 'https://billcoreatech.blogspot')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다. 1. 서비스 제공 맞춤서비스 제공을 목적으로 개인정보를 처리합니다. 제2조(개인정보의 처리 및 보유 기간) ① billcoreaTech은(는) 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다. 1.<서비스 제공> <서비스 제공>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<사용자의 설정시간>까지 위 이용목적을 위하여 보유.이용됩니다. 보유근거 : 앱의 기본기능 활용에 필요한 위치정보 제3조(개인정보의 제3자 제공) ① billcoreaTech은(는) 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다. ② billcoreaTech...