2012-12-23 4 views
1

Django에서 제 3 자 서비스 (Facebook, LinkedIn 등)의 고유 ID를 기반으로 사용자를 기록하는 사용자 정의 인증 백엔드를 구현하려고합니다. 기본적으로, 한 번 사용자 OAuth 타사 서비스에 다시 독특한 식별자를 얻을, 나는 그들을 원활하게 로그인 싶습니다.Django 타사 앱을 통한 사용자 정의 인증 백엔드

하지만 내 사용자 정의 백엔드가 작동하지 않고 '없음'을 반환합니다. 내 settings.py에서이 백엔드 설정 한

from myapp.models import Account 
from django.contrib.auth.models import User 

class ThirdPartyServiceBackend(object): 

    def authenticate(self,acct_id=None): 
     if acct_id is not None: 
      try: 
       return User.objects.get(account__uniq_id=acct_id) 
      except: 
       return None 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

:

여기 내 사용자 지정 백엔드의

AUTHENTICATION_BACKENDS = (
    'myproject.myapp.backends.ThirdPartyServiceBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

을 그리고 이것은 내가 views.py에서이를 처리하는 방법입니다

# oauth processing and everything goes here 
try: 
    # login and redirect to search page 

    user = authenticate(acct_id=third_party_service_user_info['id']) 

    if user is not None: 
     auth_login(request,user) 
     return HttpResponseRedirect('/') 

이 호출은 셸에서 문제없이 작동합니다. 사용자가 반환됩니다. 하지만 인증 호출이 실패합니다 - 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

답변

2

: 사용자가 인증되면,되는 백엔드 장고 저장하는 사용자 세션에서 사용자를 인증하기 위해 사용 된

, 다시 - 현재 인증 된 사용자에 대한 액세스가 필요할 때마다 해당 세션의 지속 기간 동안 동일한 백엔드를 사용합니다. 이는 인증 소스가 세션별로 캐시된다는 것을 의미하므로 AUTHENTICATION_BACKENDS를 변경하면 사용자가 다른 방법으로 재 인증하도록해야하는 경우 세션 데이터를 지워야합니다. 간단한 방법은 단순히 Session.objects.all(). delete()를 실행하는 것입니다.

동일한 문제가 있었지만 수정 사항이었습니다.

관련 문제