2013-06-27 4 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} 

Это тот же самый процесс Войти Я использовал при создании пользователя Django до того, как в этой точке зрения:

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, 
}) 

Я хочу, чтобы один и тот же результат с моим четыреугольным логином процесс - пользователь аутентифицируется и регистрируется/распознается как пользователь Django. Вместо этого я продолжаю видеть эту ошибку:

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 символов? Возможно, это проблема, потому что [имя пользователя не может быть длиннее этого) (https://docs.djangoproject.com/en/1.5/ref/contrib/auth/#django.contrib.auth.models.User). –

+1

Это не тот случай, я видел другие вопросы с одинаковой точкой на них. Я думаю, что длина по умолчанию для поля электронной почты составляет 75 символов. –

+0

для почтового ящика, возможно, но вы также используете адрес электронной почты для поля вашего имени пользователя –

ответ

1

В настоящее время он проверяет только стандартный сервер Django, но вы должны написать пользовательский, который выполняет аутентификацию пользователя через 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 
0

Я выяснил причину, по которой это не работало, потому что у меня не было настраиваемой базовой конфигурации. Я написал «Gist», описывающий, как я это сделал, и установил его здесь: https://gist.github.com/triplec1988/5891167