Django的Twitter OAuth
借此文章进行投稿,我将尝试在Django中进行Twitter认证。
【备忘录】在pyramid上使用Twitter OAuth
http://qiita.com/maueki/items/02f001440ce409641a50
Django的默认用户认证
在Twitter认证之前,Django已经从一开始就提供了用户认证系统。首先我们来看一下这个系统。
环境准备
首先,安装Django。
$ pip install django
这次我使用的是1.10.5版本。Python版本是3.5.2。
接着创建Django项目并创建管理员用户。
$ django-admin startproject myoauth
$ cd myoauth
$ python manage.py migrate
$ python manage.py createsuperuser
接下来,我将创建一个应用程序。
$ python manage.py startapp app
你可以在settings.py的INSTALLED_APPS中添加你创建的应用程序。(同时建议你修改一下区域设置)
INSTALLED_APPS = (
:
'app.apps.AppConfig',
)
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
如果您想了解更多细节,请查看官方教程:https://docs.djangoproject.com/ja/1.9/intro/tutorial01/
登录页和登出页
在urls.py文件中指定登录和登出的url和视图。这些视图已经在标准库中提供了。(这些视图采用的是MTV模式中的视图。)
import django.contrib.auth.views
urlpatterns = [
:
url(r'^login/$',
django.contrib.auth.views.login,
{
'template_name': 'app/login.html',
},
name='login'),
url(r'^logout/$',
django.contrib.auth.views.logout,
{
'template_name': 'app/logout.html',
},
name='logout'),
]
login.html的准备大致如下。
:
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
:
在setting.py中,您需要记录登录后重定向的URL以及访问有限制页面时要跳转的URL。
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login/'
登录状态的检查 (Liú de
给视图加上”login_required”修饰符,这样只有在登录的情况下才能访问。如果未登录,则会重定向到在setting.py中设置的LOGIN_URL。
from django.contrib.auth.decorators import login_required
@login_required
def private(request):
...
urlpatterns = [
:
url(r'^private/$', app.views.private, name='private'),
]
除此之外,您可以使用user_passes_test装饰器,通过lambda函数对用户进行任意的检查。下面的示例限制了超级用户权限。
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.is_superuser)
def private(request):
...
审核推特账户
下面是一个用Twitter进行认证的尝试。
应用程序注册
作为前准备,您需要前往Twitter的开发者页面注册应用程序。
请访问以下链接:https://apps.twitter.com
-
- Consumer Key
- Consumer Secret
这两把钥匙都是必需的。
添加OAuth库。
尽管有各种不同的选择,但这次我们选择了social-auth-app-django。除了Twitter外,Facebook和GitHub也可以同样使用。
$ pip install python-social-auth[django]
这次尝试的版本将会是1.0.0。
INSTALLED_APPS = (
:
'social_django',
)
TEMPLATES = [
{
:
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.media',
'django.template.context_processors.static',
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect',
],
},
},
]
AUTHENTICATION_BACKENDS = [
'social_core.backends.twitter.TwitterOAuth',
'django.contrib.auth.backends.ModelBackend',
]
SOCIAL_AUTH_TWITTER_KEY = 'Consumer Key'
SOCIAL_AUTH_TWITTER_SECRET = 'Consumer Secret'
在Twitter认证按钮上,可以准备成这样子。
<button type="button" onclick="location.href='{% url 'social:begin' 'twitter' %}'">Twitter</button>
urlpatterns = [
:
url(r'', include('social_django.urls', namespace = 'social')),
]
我添加了一个应用程序,所以最后会进行迁移。
$ python manage.py migrate
通过这个方法,您可以进行Twitter认证。认证后,将被添加到Django的标准用户模型中,因此可以像进行标准用户认证一样进行登录状态的检查等操作。