본문 바로가기

notes

rest API에 페이스북 로그인 (소셜 로그인)하기

@마크다운


페이스북 로그인을 만들기 위해 이것저것 삽질을 열심히 했다.

기록하자


내가 원했던 페이스북(소셜 로그인)은 프론트,IOS,Android(이하 앞단 )등에서 페이스북 access_token을 받아서 그 토큰을 rest로 서버에 보내는 것이다.

서버에서는 받은 토큰으로 facebook API에 요청을 보내 유저의 정보를 받는것이 목적이다.


먼저 앞단에서 access_token을 받는것을 구현을 해야하는데 html,css수준만 간단히 할 줄 알던 나에게 시작부터 문제가 생겼다.


[developers.facebook](https://developers.facebook.com/docs/javascript)에서 빠른시작을 위해 script를 지원해주고 있으나 자신이 없었다.


그래서 예전 강사님이 만들어주셨던 코드를 다시 사용해 access_token을 받기로 했다.

[코드보러가기](https://github.com/hongdonghyun/My-Note/tree/master/social-login/front)



이후 rest를 통해 데이터를 잘 받아서 "가입을 시키고 로그인을 시켜줘야겠다." 라고 생각했다.


여기서 문제가 생긴게 지금 만들고 있는 서버는 아이디형식이 email형식이다.

하지만 페이스북에서는 간혹 유저정보에 email이 없는 경우가 있다.

[없는이유](https://developers.facebook.com/docs/facebook-login/permissions/#reference-email)


나의 경우에도 이메일로 가입하지 않았던건지 email이 없었다.


그럼 어떻게 가입을 시켜야하는거지?? 여기서 멘붕에 빠져버린것이다.


내 두뇌를 오버클럭시켜 최대한 생각을 해봤지만 어떻게 해야하는지 답이 안나오는것이다.


그렇게 인생무상 삼라만상에 대한 진리를 깨우치려 할 때, 페이스북의 유명 django그룹이 생각이 나서 글을 써보기로 했다.

[글보러가기](https://www.facebook.com/groups/askdjango/search/?query=%EC%95%84%EC%9D%B4%EB%94%94%EA%B0%80%20email)


많은분들이 답변을 주셨지만 솔직히 생각 못한 부분은 아니었다.


그렇게 많은 생각을 하던중


애초에 왜 아이디를 email로 쓰려했을까 라는 생각이 들었다.


현재 서버에는 결제모듈이 붙기 때문에 email을 받아서 처리를 하려고 아이디로 지정했다는 생각이 들었다.


하지만 "그냥 유저정보에 email을 받아도 되잖아?" 라는 생각이 들었고 아이디를 EmailField에서 CharField로 바꿨다.

### 

django 자체 로그인에서는 email형식을 그대로 사용하기 위해 validation을 진행 했고


소셜 로그인에서는 별도의 validation을 진행하지 않는대신


아이디의 유일성을 만족시키기 위해 fb_{app_id}형식으로 지정을하여 저장했다.


앱에서 돌려주는 숫자값은 앱안에서는 절대 겹칠일이 없다는 말이 생각나서 id값으로 저장을하면 별도의 validation을 하지않아도 되고


혹시 다른 소셜로그인과 겹치지 않을까라는 생각에 id값 앞에 소셜로그인의 이름을 붙여주었다.


>솔직히 만족스러운 결과는 아니지만 그래도 이후에 진도가 쭉쭉나가서 처음해보는 카카오와 네이버 로그인도 만들었다는 점이 날 고무시켰다.


>삽질할때는 내가 왜 이짓을 해야하나 싶을정도로 스트레스를 받지만 해결하고 났을때 희열이 다시금 나에게 동기부여를 하게 해준다.