Facebook sdk로 페이스북 로그인 구현하기

안드로이드 블로그

나처럼 에이전시 회사에서 일하다보면 sns로그인 기능을 붙이는건 너무 흔한 일이다.
페이스북 로그인도 정말 많이 구현하는데 이때까지 주로 firebase를 통해서 기능을 구현했다.
이번에는 좀 다르게 해보려고 facebook sdk를 사용해서 구현해보려고한다.

1. 페이스북 개발자센터에 앱 등록


페이스북 개발자센터 앱 등록

☝ 페이스북 개발자 센터에서 MyApps 메뉴에 들어간다.


페이스북 개발자센터 앱 만들기

☝ 앱만들기 버튼 클릭해서 앱을 만들어준다.



페이스북 개발자 센터 앱 정보 생성

☝ 만든 앱을 클릭해서 들어가면 앱ID와 앱 시크릿 코드가 생성되어있다.


페이스북 개발자센터 플랫폼 등록

☝ 스크롤을 쭉 내려서 "플랫폼 추가" 클릭


☝ 키해시, 패키지 이름, 클래스 이름 적어주기


2. 해시키 구하기

//keyHash 구하기
try {
val info = packageManager.getPackageInfo("패키지명", PackageManager.GET_SIGNING_CERTIFICATES)
val signatures = info.signingInfo.apkContentsSigners
val md = MessageDigest.getInstance("SHA")
for(signature in signatures) {
md.update(signature.toByteArray())
val key = String(Base64.encode(md.digest(), 0))
Log.d(TAG, "Hash key: $key")
}
} catch (e : Exception) {
e.printStackTrace()
}
어떤 클래스를 import하느냐에 따라 코드에 빨간줄이 생길 때가 있다.

잘보고 참고하길 바란다.

import android.content.pm.PackageManager
import android.util.Base64
import java.security.MessageDigest

3. dependency 추가


build.gradle 앱수준 파일에 들어가서 아래처럼 facebook login sdk를 추가한다.
dependencies {

//facebook
implementation 'com.facebook.android:facebook-login:11.3.0'

}

4. 페이스북 앱ID와 시크릿 코드 저장


1번에서 앱등록할 때 생성된 앱ID와 시크릿코드를 strings.xml 파일에 저장해둔다.
<resources>
<string name="facebook_app_id">00000000000000</string>
<string name="facebook_secret_code">x00000x000ff915017b2e71a037305ab</string>
</resources>

5. meta-data 및 인터넷 권한 등록

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.atest.test">

<uses-permission android:name="android.permission.INTERNET" />

<queries>

<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />

</queries>

<application
android:name="com.atest.test.MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">

<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />

</application>

</manifest>
manifest.xml파일에 인터넷 권한, queries, meta-data를 작성해준다.

6. 페이스북 로그인 코드 작성

private fun tryFacebookLogin() {
val loginManager = LoginManager.getInstance()    //1

loginManager.logInWithReadPermissions(this, Arrays.asList("public_profile", "email"))    //2
loginManager.registerCallback(callbackManager, object : FacebookCallback<LoginResult?> {    //3
override fun onSuccess(result: LoginResult?) {
Log.d(TAG, "Facebook login success: ")

val request = GraphRequest.newMeRequest(result?.accessToken) { jsonObj, response ->    //4
try {
Log.d(TAG, "jsonObj : ${jsonObj.toString()}")
val id = response?.getJSONObject()?.getString("id").toString()
val email = response?.getJSONObject()?.getString("email").toString()

loginSuccessCall("success", id, email, "", "F")
} catch (e: Exception) {
e.printStackTrace()
}
}

val parameters = Bundle()
parameters.putString("fields", "email")
request.parameters = parameters
request.executeAsync
()    //5
}

override fun onCancel() {
Log.d(TAG, "Facebook login cancel: ")
loginFailureCall("user canceled", "F")
}

override fun onError(error: FacebookException?) {
Log.d(TAG, "Facebook login error: ")
loginFailureCall("error occurred", "F")
}
})
}
1 => facebook loginManager 객체를 만들어준다

2 => 필요한 권한을 입력한다.

3 => 페이스북 로그인 성공, 실패, 에러시 호출할 콜백함수를 등록한다.

4 => 페이스북 로그인에 성공했을 때 필요한 사용자의 정보를 가져올 request 객체를 만든다.

5 => 사용자 정보 가져오기 실행

✋ 그래프 API
페이스북에서는 사용자의 정보를 가져오는 API를 "그래프 API"라고 한다.
여기에 들어가면 그래프API를 테스트할 수 있다.

페이스북 그래프api 테스트

1 => 먼저, 토큰을 생성한다.
만약 로그인 창이 뜨면 로그인을 하면된다.

2 => 사용자 정보요청에 필요한 권한을 설정한다.

3 => "제출" 누르면 테스트가 실행된다.

4 => 더 필요한 정보가 있다면 필드를 추가해서 테스트한다.

👉 사용자 정보 요청에 필요한 권한은 "내 앱" -> "앱 검수" -> "권한 및 기능"에 들어가서 설정한다. (아래 그림 참고)

페이스북 사용자 권한 요청