프로그램/Android

안드로이드 SNS Facebook 로그인

잡식성초보 2018. 11. 12. 08:00

안드로이드 SNS 로그인 인증 FaceBook 관련입니다.


요즘 앱개발시 로그인을 할때 SNS를 이용하여 개발을 해달라는 경우가 많이 있어서


최근에 샘플을 만들고 간단하게 정리를 해놓도록 하겠습니다.


첫번째 다른 서비스의 API를 이용하기 위해서는 항상 그 페이지에 가셔서 앱을 생성하여야 합니다.


그러기 위해서 페이스북 Developer 사이트를 방문합니다(페이스북 페이지 링크)



1. 새 앱 만들기를 클릭합니다.




2. 앱명을 적어 간단하게 만든 후 제품추가에서 사용할 Facebook 로그인을 클릭하여 줍니다.




3. 안드로이드 추가를 클릭하셔야겠죠?





4. Gradle 프로젝트 관련에서  아래녀석들을 추가합니다.

mavenCentral()
implementation 'com.facebook.android:facebook-login:[4,5)'



5. 이후 FaceBook에서 적힌 순서대로 천천히 값을 넣어주시면 됩니다.


패키지명입력, 페이스북을 사용할 Activity등록, 키해쉬값 생성, Manifest등록이 있습니다.


키해쉬값 생성의 경우는 아래 소스를 넣고 앱을 돌려서 가져온 값을 사용하였습니다.


try {
PackageInfo info = getPackageManager().getPackageInfo("그대의 패키지명", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}


Manifest등록 관련은 아래와 같습니다.


앱생성시 생성된 ID값과 Scheme값만 적어주시면 됩니다.

<activity android:name="com.facebook.FacebookActivity"
android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />

<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="페이스북 스키마 값 생성시 만들어짐" />
</intent-filter>
</activity>

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="페이스북 아이디값"/>


6. 이후 페이스북을 사용하겠다고 등록한 Activity xml에서 페이스북 로그인 버튼을 만듭니다.


<com.facebook.login.widget.LoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp" />


등록한 Activity에서 아래 소스를 이용하면 필요한 정보를 가지고 활용하실수 있으실 겁니다.

(주석 달린것들과 로그를 찍은 부분을 보시면 쉽게 활용 가능합니다.)


loginButton = findViewById(R.id.login_button);
loginButton.setReadPermissions("email");

callbackManager = CallbackManager.Factory.create();

/** 페이스북 로그인 버튼 클릭시 Callback을 받음 **/
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.e(TAG, "FaceBook 로그인 성공 ");
/** 페이스북 로그인 성공시 계정에 관련된 정보는 별도로 가지고 와야함 **/
GraphRequest request = new GraphRequest().newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
Log.e(TAG, "FaceBook onSuccess : " + object.getString("email"));
}catch (Exception e){
e.printStackTrace();
}
}
});

Bundle parameters = new Bundle();
parameters.putString("fields", "email");
request.setParameters(parameters);
request.executeAsync();
}

@Override
public void onCancel() {
// App code
Log.e(TAG, "FaceBook 로그인 취소");
}

@Override
public void onError(FacebookException exception) {
// App code
Log.e(TAG, "FaceBook 로그인 에러");
}
});

AccessTokenTracker accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
if(currentAccessToken == null){
Log.e(TAG, "FaceBook onCurrentAccessTokenChanged currentAccessToken is null");
} else {
Log.e(TAG, "FaceBook onCurrentAccessTokenChanged currentAccessToken is not null");
}
}
};

accessTokenTracker.startTracking();

AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
if(isLoggedIn){
Log.e(TAG, "Facebook 로그인 상테 ");
} else {
Log.e(TAG, "Facebook 비 로그인 상태 " );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);

super.onActivityResult(requestCode, resultCode, data);
}

그리고 하나 참고를 하자면 다른SNS같은경우는 토큰의 만료기간이 있습니다. 


하지만 FaceBook같은 경우에는 모바일기기앱에 대해서는 영구적인 쿠키를 준다고 합니다. (링크참조)




반응형