본문 바로가기

Android

[25일차]페이스북 로그인 연동

오늘은 마지막으로 채팅할건데 이거 하기 전에 오늘부터 프로젝트 들어갈거다. 





예제

페북로그인에 성공하면 로그인한 토큰을 먼저 얻는다. 서버에 값을 저장하는건 아니다. 저걸 가지고 페북에게 정보를 요청하고, 받은

정보를 저장하는 거지, 지금 얻은 토큰은 저장하면 안된다.

서버의 규격서를 확인한다. 사용자가 서버에게 요청했을 때의 결과로써 로그인 성공, 페북 회원가입이 안되었을때, 로그인 실패했을 때 

세가지 분기로 나뉜다.(규격서에 나와있는대로 회원가입되었을 때는 code 1, 안되었을 때는 code 3, 아예 실패했을 때는 code 2이다.)

규격을통해 데이터를 하나 만들어주었고, User데이터에 facebookId를 추가해주었다. 


FacebookLoginRequest를 추가해주었고, 세가지 결과가 올 수 있기 때문에 결과값을 받아올 수 있는 타입에 Object라고 명시해주었다.

이에따라 AbstractResult가 조금 수정되었다. getType메소드가 분기로 나뉘기 때문에 바뀜.

아무튼 FacebookLoginReqeust로 돌아와서, 포스트방식이니까 ReqeustBody를 정의해주고 access_token과 registerationId를 넣어서 

빌드하였다. 마찬가지로 FacebookSignUpRequest를 생성해주었다. 받는 타입은 User로 결과값을 받고, url설정을 해주고 빌드했다.


LoginFragment로 돌아와서 페북로그인을 요청하고 성공하는 과정에서 토큰을 받아온다. 물론 실패에 대한 분기처리도 존재한다.

로그인이 성공되면, 성공했으니까 가져올 정보를 sharedPreference에 저장해야 한다. 그래서 토큰을 통해 페북아이디를 가져오고, 

propertyManager에 페북아이디를 저장했다. 페북 회원가입이 안되었을 때(code 3)에는 회원가입하라는 fragment를 띄워주기로 한다.


FacebookSignUpFragment를 생성해주었고, FacebookSIgnUpRequest를 통해 회원가입요청을 보냈다.

회원가입에 성공하면 PropertyManager에 페북아이디를 저장하고 로그인액티비티로 돌아가게 하였다.


SimpleLoginActivity로 돌아가서 changeFacebookSignUp메소드를 정의해주고 LoginFragment로 돌아가서 페북 회원가입이 안되었을 때

(code 3)에 대한 처리를 하도록 만들어주었다. 회원가입페이지로 넘어가게 하기 위한 작업.


SplashActivity에서 로그인되어있지 않았을 때에 원래 분기가 두개(이메일주소가 있을때, 없을 때)였는데, 여기 분기하나를 추가해주었다.

'페이스북로그인이면'이라는 분기인데, 이 부분은 프로퍼티매니저에 아까 넣어둔 페북아이디를 가져와서 자동로그인이 될 수 있게끔

만들어주었다. 근데 또 빡치는게 여기서 분기가 또 나뉜다.

페북로그인이 되어있는 상태에서 페북에 로그인하라, 페북로그인이 안되어있는 상태에서 페북로그인하라. 페북 로그인이 가능한지 

불가능한지에 대한 판단을 위해서 필요하다. 


그래서 processFacebookLogin()안에 토큰이 accessToken이 null이 아니면(로그인이 되어있다면), 내 서버에 로그인만 하면 된다는

의미이다. 내 서버에 로그인한다는 말은 FacebookLoginRequest만 보내면 된다는 말이다. 시발 여기 또 분기 나뉘는데,

실패했을 때에는 회원가입은 안되어있는데 로그인은 되어있다..그말은 즉 로그아웃을 다시한번 시켜주고 로그인액티비티로 띄워줘야

한다는 말이다(onSuccess의 else문). 그 다음(onFail)에서는 엑세스토큰이 만료되었기 때문에 생기는 일이라는데 그 때는 로그아웃을

해주고 로그인을 해야한다.


다시 돌아와서.. 이전문단은 토큰이 있을 때 얘기고.. 토큰이 없다면 토큰을 받아와야 하므로, 앱이랑 페북세션이 만료되었을 때?

페이스북에 로그인한 사용자정보와 내 정보가 다르다면 로그아웃 한번 해주고 로그인액티비티로 이동.. 그렇지 않으면 로그인 성공...하


processFacebookLogin() 메소드 맨위에 if문을 추가하였는데, 이 때는 사용자가 바뀌었을 떄의 분기이다.

내가 A라는 사용자로 페북에 로그인했고, 내 앱에서는 로그인을 안풀었는데, 페북에서 로그아웃을 하고, 다른사용자로 로그인하였을

상황을 처리하기 위함이다.


마지막으로 메인액티비티에서 로그아웃할 때, 페북로그아웃도 해줘야 함.


---------------------------------------------------------------------------------------------------------------------------

다시 정리.

페이스북으로 로그인했는지를 따져본다. sharedPref에 저장되어있는 facebookId를 확인해서 이게 있다면 나는 페이스북으로

로그인했었으니, 페이스북으로 자동로그인하겠다. 이게 isFacebookLogin(). 내가 페이스북으로 이전에 로그인했었는지를 알려줌.


이제 페이스북으로 자동로그인을 할거야. 두가지로 나뉘어.

1. 페이스북 앱이 로그인되어있는 경우에 로그인할 때

2. 페이스북 앱이 로그인되어있지 않은 경우에 로그인할 때

내 서버의 세션은 만료되었지만, 페이스북 세션은 내서버의 세션과 별개이기 떄문에 나뉘는 경우이다.


1번의 경우 

1-1. 페이스북에 있는 계정과 내 계정이 같은지를 확인해야 한다. 같으면 상관없는데, 같지않으면 이전에 자동 로그인한 계정이 아니자나

그래서 다시 로그인을 시켜야 한다. 그래서 LoginFrag로 이동하여 로그인되어있는 것을 로그아웃 시키고, sharedPref에 저장된 아이디를

날림. 이게 processFacebookLogin()의 첫번째 분기였음. 시나리오적으로 이럴 가능성은 적다. 이때는 내 페이스북에 대한 정보를 

유지하고 있기 때문. 방어코드라고 함.

1-2. 페이스북 로그인 되어있으니까 로그인 다시할 필요 없지, 이상태에서는 내서버에 로그인만 하면 된다. 

1-2-1. 성공. 메인액티비티로 이동.

1-2-2. 여기서 회원가입을 하라는 말이 뜬다. DB가 꼬였을 때 이런말이 나옴. 내앱에서는 로그인을 했는데, 웹에서 회원을 탈퇴했어. 

그럼 이런케이스가 나옴. 근데 자동로그인인데 당연히 회원가입하라는 말이 왜나오냐, 그래서 로그아웃 시키고, sharedPref날려버리고,

LoginActivity로 이동.

1-2-3. 실패했음. 액세스토큰을 가지고 로그인을 했는데 실패했다. 페이스북이 만료시간이 1초남았을 때, 서버에서는 만료되었다고하니까

이때에는 다시 로그인.


2번의 경우

페이스북 로그인이 안되어있다는 얘기이다. 그럼 페이스북 로그인을 하면 된다. facebookLogin() 메소드가 이때 필요.

로그인 안되어있으면 callback어쩌구 해주고 loginWithReadPermission까지 해주는거야. 이렇게해서 성공, 실패, Cancel이 있는데

실패, cancel은 그냥 로그인 화면으로 넘기면 되는거야.

성공했을때

2-1. 페북계정과 내 앱이 같냐? 다르면 내 앱을 로그인한 상태에서 세션이 만료되었는데, 페북에서 계정을 로그아웃했다가 다른계정으로

로그인했으면 이때는 로그인 성공했다고 보면 안되지. 그래서 로그아웃시키고, 로그인화면으로다시 넘겨야함.

추가설명. 시간이 지나 페북로그인도 만료되고 내로그인도 만료되었어. 페북에 들어가서 계정을 다른걸로 로그인을 했어. 이상태에서

내앱에 진입을해. 페이스북앱을 이용해서 로그인하니까 abcd로 로그인되고 나의 pref에는 이전 id로 접근하려고하니까 미스매치가 뜸.

(1-1과 같은 행동이긴하나 이건 가능성이 꽤 존재한다.)

2-2. 페북계정과 내앱이 같으면 로그인하면되.

2-2-1. 로그인 성공. 메인액티비티로 이동

2-2-2. 회원가입하라고 나와. 회원가입나오면 안되는데 나온거자나. 마찬가지로 로그아웃하고 sharedPref초기화 하고 LoginActivity로~

2-2-3. 로그인 실패. 이런 케이스가 실제로 나오는 경우가 없다. 페이스북이 이상한짓을 하지 않는 이상. 그냥 로그인 액티비티로 보내.

'Android' 카테고리의 다른 글

[안드로이드 개발기간] request만들기  (0) 2016.09.11
[25일차] 채팅  (0) 2016.08.23
[24일차]구글 GCM 메카니즘  (0) 2016.08.22
[24일차] 연동 로그인 페이스북  (0) 2016.08.22
[23일차]페이스북 로그인 실습  (0) 2016.08.19