2013-05-05 3 views
7

사용자가 Facebook을 통해 가입 할 수있는 모바일 앱이 있습니다. FB에서 액세스 토큰을 받으면 장고 백엔드로 보냅니다.api를 통해 액세스 토큰이 주어지면 새 사용자 및 새 django allauth 소셜 계정을 만드는 방법은 무엇입니까?

하지만 그 다음은 무엇입니까?

django-allauth 내부에 액세스 토큰을 공급하여 새로운 사용자/사회 계정을 만들 수있는 방법이 있습니까?

아니면 수동으로해야합니까?

답변

6

나는 항상 질문을 게시 한 직후 대답을 알아내는 것처럼 보입니다. 어쨌든 다음은 UserResource (ApiKeyAuthentication을 사용하는 tastypie API)에 대한 사용자 지정 메서드입니다. 대부분은 allauth.socialaccount.providers.facebook.views의 login_by_token 메소드에서 가져 왔습니다.

더 나은 답변을 게시하는 경우 잠시 동안 내 대답을 올바르게 선택하지 않겠습니다.

def facebook_login(self, request, **kwargs): 
    self.method_check(request, allowed=['post']) 

    data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json')) 

    access_token = data.get('access_token', '') 

    from allauth.socialaccount import providers 
    from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp 
    from allauth.socialaccount.providers.facebook.views import fb_complete_login 
    from allauth.socialaccount.helpers import complete_social_login 
    try: 
     app = SocialApp.objects.get(provider="facebook") 
     token = SocialToken(app=app, 
          token=access_token) 
     login = fb_complete_login(app, token) 
     login.token = token 
     login.state = SocialLogin.state_from_request(request) 
     ret = complete_social_login(request, login) 

     #if we get here we've succeeded 
     return self.create_response(request, { 
       'success': True, 
       'username': request.user.username, 
       'user_id': request.user.pk, 
       'api_key': request.user.api_key.key, 
       }) 
    except: 
     # FIXME: Catch only what is needed 
     return self.create_response(request, { 
       'success': False, 
       'reason': "Bad Access Token", 
       }, HttpForbidden) 
+0

나는 allauth 코드를 통해 수수께끼 시간을 보냈다 , 그리고 결국이 비슷한 꽤 뭔가를 생각해 냈지만 ... 단지 지금이 발견. 감사! – Kobold

+0

이 코드를 어떻게 호출합니까? – diofeher

+1

새 버전으로 이제'fb_complete_login (요청, 응용 프로그램, 토큰) ' – psychok7

1

작업 소스 코드 : 수준은 UserResource에서 (ModelResource) : 다음

def override_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/facebook_login%s$" % 
      (self._meta.resource_name, trailing_slash()), 
      self.wrap_view('facebook_login'), name="api_facebook_login"), 
    ] 

def facebook_login(self, request, **kwargs): 
    self.method_check(request, allowed=['post']) 

    data = self.deserialize(
     request, 
     request.raw_post_data, 
     format=request.META.get('CONTENT_TYPE', 'applicaton/json')) 

    access_token = data.get('access_token', '') 

    print(access_token) 

    from allauth.socialaccount import providers 
    from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp 
    from allauth.socialaccount.providers.facebook.views import fb_complete_login 
    from allauth.socialaccount.helpers import complete_social_login 
    try: 
     app = SocialApp.objects.get(provider="facebook") 
     print(app) 
     token = SocialToken(app=app, 
          token=access_token) 
     login = fb_complete_login(app, token) 
     login.token = token 

     login.state = SocialLogin.state_from_request(request) 
     ret = complete_social_login(request, login) 

     #if we get here we've succeeded 
     return self.create_response(request, { 
       'success': True, 
       'username': request.user.username, 
       'user_id': request.user.pk, 
       'api_key': request.user.api_key.key, 
       }) 
    except: 
     # FIXME: Catch only what is needed 
     return self.create_response(request, { 
       'success': False, 
       'reason': "Bad Access Token", 
       }, HttpForbidden) 

:

---dump 헤더 곱슬 곱슬 - "콘텐츠 형식을 -H : 응용 프로그램/json "-X POST - 데이터 '{"access_token ":"xxxxxxxx "}'http://xx.xxxxxx.com:8000/api/v1/user/facebook_login/

테스트 OK, 사용자 만들기 OK.

감사합니다.

+0

무엇이 누락 되었습니까? 이것은 내가 게시 한 것과 정확히 같습니다. 어쨌든, 나는 그때부터 페이스 북 이메일과 동일한 이메일을 가진 사용자가 이미 db에있을 때와 같은 많은 시나리오가 있기 때문에 매우 나쁜 해결책이라는 것을 깨달았습니다. – KrisF

+0

@KrisF이 시나리오를 다루는 답변을 게시 할 수 있습니까? – rajat

+0

@rajat 죄송합니다. 전적으로 다른 것을 생각하기 전에 그것을 결코 알지 못했습니다. – KrisF