Python Django+;Foursquare OAuth+;用户登录

Python Django+;Foursquare OAuth+;用户登录,python,django,oauth-2.0,foursquare,django-authentication,Python,Django,Oauth 2.0,Foursquare,Django Authentication,我在google和stackoverflow上看了一些关于这个主题的其他问题,但似乎找不到正确的解决方案。我正在尝试使用foursquare对应用程序的用户进行身份验证。当用户使用foursquare登录时,我想在数据库中创建一个用户,并存储他们的一些信息。这一切都很好。同时,我想让他们以经过身份验证的用户身份登录。这就是我遇到麻烦的地方。我的观点是这样的: def foursq_done(request): # get the access_token access_token = reque

我在google和stackoverflow上看了一些关于这个主题的其他问题,但似乎找不到正确的解决方案。我正在尝试使用foursquare对应用程序的用户进行身份验证。当用户使用foursquare登录时,我想在数据库中创建一个用户,并存储他们的一些信息。这一切都很好。同时,我想让他们以经过身份验证的用户身份登录。这就是我遇到麻烦的地方。我的观点是这样的:

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,
})
我希望foursquare登录过程得到相同的结果——用户经过身份验证并登录/识别为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'

我不希望foursquare用户是匿名用户,但很明显,当我运行authenticate()时,有些东西不起作用。我做错了什么?

我发现这不起作用的原因是因为我没有自定义后端设置。我写了一个要点来描述我是如何做到这一点的,并在这里进行了设置:

我发现这不起作用的原因是因为我没有自定义的后端设置。我写了一个要点来描述我是如何做到这一点的,并在这里进行了设置:

现在,它只检查标准的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

现在,它只检查标准的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

您的电子邮件地址是否超过30个字符?也许这就是问题所在,因为这里的情况并非如此,我看到其他问题也有同样的观点。我认为电子邮件字段的默认长度是75个字符。对于电子邮件字段,也许是这样,但是你也可以使用电子邮件地址作为用户名字段啊,我明白了。我数了数,在本例中,我正在测试的电子邮件地址少于30个字符,但在进一步构建时,我肯定会注意到这一点。你只需要弄清楚为什么不认证这些用户。你的电子邮件地址是否超过30个字符?也许这就是问题所在,因为这里的情况并非如此,我看到其他问题也有同样的观点。我认为电子邮件字段的默认长度是75个字符。对于电子邮件字段,也许是这样,但是你也可以使用电子邮件地址作为用户名字段啊,我明白了。我数了数,在本例中,我正在测试的电子邮件地址少于30个字符,但在进一步构建时,我肯定会注意到这一点。只是要弄清楚为什么它不认证这些用户。