본문 바로가기

Android

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

페이스북 로그인 퍼미션 하나 추가 해야된다. 


provider+ 앱 ID 





페이스북 로그인 메카니즘 



페이스북 로그인 하고 나면 페이스북에 대한 엑세스 토큰을 얻는다. 


액세스토큰이라는게 여기 접근하는 key 이다. 




인증 값이 있으면 누가 접근했는지 알 수 있다. 


그래서 그 토큰을 내 서버에 넘기고, 페이스북으로 넘기면 누군지 알 수 있다. 



페이스북 로그인 연동


토큰을 획득한다 인증값 

앱에서 서버로 토큰을 보내고 서버에서 다시 페북으로 토큰을 보내서 인증을 하는거

페북 아이디만으로 한다면 보안에 문제가 생김 그래서 access_token을 통해 사용자 정보를 얻는다

페북 id로 내 db의 id를 확인한다.


db에 id가 있는 경우 - 사용자가 이미 가입을 한 경우 


db에 id가 없는 경우 - 사용자가 서비스에 가입을 하지 않고 페이스북 로그인만 성공한거


e-mail이 반드시 필요한 경우 페이스북에 있는 경우엔 동의만 받고 없으면 입력하게끔 받음.


로그인버튼에서 email 퍼미션 획득하고 onActivityResult로 콜백매니져등록해줘야 실행됨

로그인이 성공하면 프로세스에프터페이스북로그인이 호출되고 여기서 토큰을 얻는다

accessToken.getToken에 스트링으로 토큰이 넘어온다(여기서 토큰은 한시간 정도 밖에 안되기때문에

토큰을 저장하는 게 아니라 그 토큰을 이용해 정보를 저장하는 거)

그다음 요약서 확인 - post로 보내고 facebooksignin으로 요청 - 성공 1, 회원가입안되있으면 3 실패2

userdata에 스트링으로 facebookid 추가 getset 추가

jsondata로 FacebookUser라는 데이터클래스 생성함 실패는 똑같으니까 냅둠

리퀘스트 하나 만든다 페이스북로그인리퀘스트 abstractRequest<>아직 뭐가 올지 정의하기 힘드니까

NetworkRequest<Object>로 함 (회원가입 된 경우는 user데이터, 안된 경우에는 facebookuser데이터가 오니까)


abstractrequest에서 else하나 더 추가getCode하는데 (아마 facebook 로그인이 세가지경우라 그런듯)

프로텍티드로 타입을 리턴하는 get타입 함수를 정의 한다.인자는 코드


리퀘스트에서 인자가 없는 겟타입은 1번 경우 가입된 경우임 

인자로 코드를 받아서 코드가 3이면 페이스북 유저 

원랜 코드값이 -면 실패, 그리고 하나씩 증가하면서 해주면 됨 



이제 생성자에서 컨텍스트 토큰 레그아이디를 인자로 받는다. 그다음 그거 있잖아 

url가져와서 request만드는 거. url = 겟베이스url빌더.애드패스페이스북사인인.빌드

그다음 body만들어주고 바디에 토큰이랑 레그아이디 넣어줌

그럼 url이랑 바디 만들었으니까 request만들 수 있지 포스트방식으로 다가


facebook 회원가입도 필요함. 여기서 메일이랑 유저네임 두개만 필요한게 나머지는 서버 세션에

저장되있으니까 서버에 필요한것만 받으면 되는거


페이스북사인업리퀘스트 만든다. 생성자에 컨텍스랑 유저네임이랑 이메일 세개 이제 플로우 좀 알겠냐

포스트니까 body가 필요한거 아까랑 똑같음 

여기는 getType 인자없는 것만 해주면 됨(조금 생각해보기)


다시 올라가서 로그인이 성공했으면 거기서 리퀘스트를 만들어야지

페이스북로그인리퀘스트를 만든다.

네트워크 매니져에서 이제 성공했을 경우 코드가 1인 경우와 3인 경우를 나눠서 처리해준다.

1인 경우면 sharedpreferences에 저장하면 되지 정보를 그러니까 property매니져에서 

페이스북id를 상수로 정하고 그 아이디를 저장할거야 setFacebookId 함수 정의함

에디터에 페이스북아이디넣어주고 커밋 겟에서는 mPefs.getString으로 상수 키 넘김


그다음 다시 돌아와서 밑에서 쓰게 accessToken final로 정의한 후 

accessToken에서 유저아이디 가져오고 프로퍼티매니져를 통해 쉐어드프리페어런스에 저장

그다음 메인화면으로 넘어감 moveMainActivity 호출 그럼 1번 경우 끝


3번 경우에는 아까 위에서 얘기했듯이 페이스북을 가입시키던지 이메일을 입력받던지 하는 ui를 

만들기 위해서 FacebookSignUpFragment를 하나 만듬


layout만들어야겠지? signup프레그먼트 레이아웃 갖다 쓰자 유저네임이랑 이메일만 있으면 되잖아 그것만 갖다써


FacebookUser데이터를 시리얼라이저블로 만들고 페이스북 프레그먼트에서 

newInstance로 프레그먼트만들고 번들 생성하고 상수정의하고(키) 번들에 put시리얼라이저블로 데이터랑 키 넣어줌 

그다음 프레그먼트의 셋아규먼트를 번들로 리턴 프레그먼트


온크리에이트에서 아규먼트가 널이 아니면 get아규먼트에 get시리얼라이져블로 user 얻어옴.


뷰들 버터나이프 크리에이트뷰에서 바인드해주고 사인 업 버튼 리스너 달아줌 

리스너에서 페이스북사인업 리퀘스트 만들고 입력받은 유저네임이랑 이메일 얻어오고 

리퀘스트 인자로 넣어줌 (둘 다 널이 아닐 때) 리퀘스트 만들었으니까

네트워크 매니져에서 유저정보 들어왔으니까 정상적으로 들어왔으면

아까처럼 프로퍼티매니저불러다가 아이디 저장하고 메인으로 넘어감.


메인에서 페이스북 사인업 함수 만들고(인자를 페이스북유저를 받음)

아까 3번코드면 체인지페이스북사인업으로 넘어감.


결국 1번 3번은 다 페이스북은 가입 된 상태인데 3번은 우리 서비스에 회원가입이 안되있는거임


그 다음 판단 하나 더 해야됨 스플래쉬에서 facebook로그인이 되어 있는 상태도 판단해야되잖아 

원래는 그냥 로그인이면 자동로그인 상태 체크하고 아니면 회원가입으로 넘겼는데

지금은 isFacebookLogin 함수를 만들어서 프로퍼티매니저에서 페이스북 아이디를 가져와서 

페이스북으로 로그인 했던 적이 있는지를 따지는거 


만들었으니까 로그인쉐어드프리페어런스에서 if 하나 더 추가하고 processFacebook로그인함수호출하면 도지


그다음 프로세스페이스북로그인함수에서 로그인

로그인매니져와 콜백매니저를 얻어옴 온크리에이트에서 

그 다음 프로세스페이스북로그인함수에서 토큰을 본다 (얻어오고) 널 체크

널이 아니면 (로그인 되있다는 소리) - 로그인 되있으니까 내 서버에 로그인하면 됨

그러니까 페이스북로그인리퀘스트 가져와(이 리퀘스트는 페이스북에는 로그인 되잇다는 리퀘스트잖아) 그지?

레그id 가져오는 거 좀 이해 안감. 그래서 또 네트워크데이터가져와서 성공시에는 코드확인해서 1이면 메인으로 보내고

3이면 로그인 매니져로 로그아웃하고 페이스북아이디 ""하고 로그인액티비티로 보내고


실패시에는 뭐더라 일단 로그아웃해줌. 그다음 facebooklogin함수 호출

액세스토큰이 만료되서 이럴 수도 있다함

액세스토큰이 널이 아니면 페이스북로그인 함수 호출함 큰 else


원래는 프로세스페이스북로그인에서 토큰의 유저아이디랑 프로퍼티매니저에 아이디랑 다른 것도 따져줘야함 

저장되있는거랑 받아온거랑 다를 때, 이 땐 기존에 있던거 로그아웃 시키고 facebookid ""해주고 로그인 액티비티로 넘기는거임

이전에 로그인했는데 이전 사용자랑 지금 사용자랑 다른거 뭐 바꿀 수 있대 


로그인매니저에 로그인퍼미션 획득함.

로그인매니져에 레지스터 콜백으로 처리해주고 

(성공시에는 액세스토큰 가져와서 토큰의 유저아이디가 

프로퍼티 매니저에 페이스북 아이디랑 다르면 아까랑 똑같이 로그아웃해주고 아이디 널 해주고 로그인액티비티로 이동)

로그인리퀘스트 얻어와서 네트워크 데이터 불러온 후에 1이면 메인으로 넘어가고 다른 경우에는 로그아웃하고 널하고 로그인으로 넘어감)

(실패시에는 로그아웃하고 페이스북 널하고 로그인액티비티로 넘어감)


마지막으로 액티비티리절트에서 callback매니져 그거 해줘


정리해줌 - 

자동로그인 페이스북이 여전히 되있는 경우 (내 서비스에선 만료되있는데)

- 이럴 땐 그냥 써주면 됨 페이스북 정보를 그게 isfacebook에서 따지는 거임

그 다음 엑세스 토큰이 널이 아니라는건 페이스북 로그인이 되있다는거야 그래서 그냥 갖다 쓰는 과정임

process여기서 그다음 페이스북 로그인이 안되있을 경우는(둘 다 세션이 만료된 경우) 이때는 ㅍ이스북로그인을 다시해줌

실패했을 경우는 난 만료가 안되있는데 서버에서 처리가 늦어질 경우 이런 거지같은 경우 

그래서 기존에 있는 로그인을 풀고 다시 로그인 해보는거임 

이 상태에서 들어왔을 때 로그인페이스북에서 처리해준 게 실패했을 땐 이상한 경우니까 페일에서 로그인으로 보내버리는거고

성공했을 때 따지는 건 내 서비스에선 a로 되어있는데 

페이스북에서는 b로 로그인한 경우(페이스북 앱에서 로그아웃 하고 

다른 걸로 로그인 했을 때)가 성공했을때 같은 사용자인지를 따지는거임


그 다음 메인에서 로그아웃 될 때 페이스북아이디도 널로 해주고 로그인매니져에서 로그아웃도 해줘야됨.




'Android' 카테고리의 다른 글

[25일차]페이스북 로그인 연동  (0) 2016.08.23
[24일차]구글 GCM 메카니즘  (0) 2016.08.22
[23일차]페이스북 로그인 실습  (0) 2016.08.19
[23일차] 페이스북 Oauth  (0) 2016.08.19
[23일차] 채팅xmpp  (0) 2016.08.19