2013-06-27 2 views
1

Google 및 stackoverflow에서이 주제에 대한 다른 질문을 보았지만 올바른 해결책을 찾지 못하는 것 같습니다. 나는 정사각형을 사용하여 응용 프로그램의 사용자를 인증하려고합니다. 사용자가 foursquare로 로그인하면 데이터베이스에 사용자로 생성 한 다음 해당 정보 중 일부를 저장하려고합니다. 이 모든 것이 잘 작동합니다. 동시에 인증 된 사용자로 로그인하려고합니다. 이것은 내가 약간의 문제가있는 곳이다. 내보기는 다음과 같습니다Django + Foursquare OAuth + 사용자 로그인

def foursq_done(request): 
# get the access_token 
access_token = request.session.get('access_token') 
print access_token 

# request user details from foursquare 
params = {'oauth_token': access_token} 
data = urllib.urlencode(params) 
url = 'https://api.foursquare.com/v2/users/self' 
full_url = url + '?' + data 
print full_url 
response = urllib2.urlopen(full_url) 
response = response.read() 
user_data = json.loads(response)['response']['user'] 
name = user_data['firstName'] 

try: 
    user = User.objects.get(username=user_data['contact']['email']) 
except User.DoesNotExist: 
    # Save information on user 
    user = User.objects.create_user(username=user_data['contact']['email'], 
     first_name=user_data['firstName'], last_name=user_data['lastName'], 
     email=user_data['contact']['email'], password=access_token) 
    profile = Profile() 
    profile.user = user 
    profile.oauth_token = access_token 
    profile.save() 

user = authenticate(username=user_data['contact']['email'], password=access_token) 

login(request, user) 

# show the page with the user's name to show they've logged in 
return TemplateResponse(request, 'foursq_auth/foursq_welcome.html', {'name': name} 

이이보기처럼, 전에 장고 사용자를 만들 때 사용한 동일한 로그인 프로세스입니다

def user_signup(request): 
if request.method == 'POST': 
    form = forms.UserSignupForm(data=request.POST) 
    if form.is_valid(): 
     user = form.save() 
     g = Group.objects.get(name='test_group') 
     g.user_set.add(user) 
     # log user in 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password1'] 
     user = authenticate(username=username, password=password) 
     login(request, user) 
     messages.success(request, u'Welcome to Social FollowUp') 
     return redirect('user_create') 
else: 
    form = forms.UserSignupForm() 
return TemplateResponse(request, 'user_signup.html', { 
    'form': form, 
}) 

나는 나의 정사각형 로그인과 같은 결과를 원하는 프로세스 - 사용자는 인증되고 장고 사용자로 로그인/인식됩니다.

Internal Server Error: /tattoo/foursquare/done/ 
Traceback (most recent call last): 
File "/Users/triplec1988/projects/tattoo/venv/lib/python2.7/site-  packages/django/core/handlers/base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
File "/Users/triplec1988/projects/tattoo/tatt2me/web_tatt2me/views.py", line 106, in foursq_done 
login(request, user) 
File "/Users/triplec1988/projects/tattoo/venv/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 92, in login 
request.session[BACKEND_SESSION_KEY] = user.backend 
File "/Users/triplec1988/projects/tattoo/venv/lib/python2.7/site-packages/django/utils/functional.py", line 203, in inner 
return func(self._wrapped, *args) 
AttributeError: 'AnonymousUser' object has no attribute 'backend' 

나는 포 스퀘어 사용자가 AnonymousUser되고 싶지 않아,하지만 난 인증()를 실행할 때 분명히 뭔가가 작동하지 않는 대신이 오류를보고하십시오. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

에서

은 EMAILADDRESS 이상 30 자인가? 아마도 그게 문제입니다. 왜냐하면 [username은 그보다 더 길 수 없습니다.] (https://docs.djangoproject.com/en/1.5/ref/contrib/auth/#django.contrib.auth.models.User). –

+1

여기서는 그렇지 않습니다. 다른 질문과 같은 점을 보았습니다. 이메일 필드의 기본 길이는 어쨌든 75 자라고 생각합니다. –

+0

아마도 emailfield에 대해,하지만 당신은 사용자 이름 필드에 대해서도 emailaddress를 사용합니다. –

답변

1

지금은 표준 Django 백엔드 만 검사하지만 foursquare에서 OAuth를 통해 인증 된 사용자를 받아들이고 인증하는 사용자 지정 사용자 정의를 작성해야합니다. Django 사용자 인증 모델을 통해. settings.py

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 
          'YOUR_APP.backends.FoursquareBackend',) 

backends.py

from django.contrib.auth.models import User 
from django.contrib.auth.backends import ModelBackend 


class FoursquareBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(username=username) 
      return user 
     except User.DoesNotExist: 
      print "Looks like this user does not exist" 
     return None 

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