关于python:如何使用Django Rest Framework创建登录API?

How do I create a login API using Django Rest Framework?

我想使用django rest框架创建一个登录api(或者如果它已经预先捆绑,则使用现有的api)。 但是,我完全不知所措。 每当我向django rest框架"登录"网址发送帖子请求时,它只会发回可浏览的api模板页面......

我的配置

urls.py

1
url(r'^api/v1/', include('rest_framework.urls', namespace='rest_framework'))

settings.py

1
2
3
4
5
6
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

我想要的是

请求:

1
POST /api/v1/login  username='name' pass='pass'

响应:

1
200 OK"{username: 'name', 'userId': '54321'}" set-cookie: sessionid="blahblah"


看一下django-rest-framework-jwt的api视图。它是用于创建auth令牌而不是cookie会话的实现,但您的实现将类似。请参见views.py和serializers.py。您可以使用serializers.py保持不变,只需调整视图以返回正确的参数,并可能设置会话cookie(如果已在身份验证中执行,则无法调用)。


如果你想要这样的东西我做同样的事情,但我使用令牌认证。

在这里查看他们的令牌页面

这可能不是你想要的,但我这样做的方式是(因为我将它用作移动客户端的rest api端点)

我可以做我的网址localhost:8000/api/users/ -H Authorization : Token
然后,浏览器可以使用您在提供的其余框架URL上创建的常规登录页面

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')

并获得"无登录"导航的令牌

url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')

然后,如果您拨打电话,您可以通过授权令牌。当然这就是我如何做到这一点,它可能不是最有效的方式,但我的目标是创建一种方式,我可以为用户提供浏览器的会话身份验证和通过令牌的移动访问。

然后在views.py中确保添加该视图的身份验证要求。与会话认证部分几乎相同

permission_classes = (permissions.IsAdminUser,)

还包括

authentication_classes = (authentication.TokenAuthentication,)

我希望这有帮助,但如果没有,祝你的搜索顺利。


当然令牌是一种很好的身份验证方式,但是提问者正在询问会话身份验证。

请求:

1
POST /api/v1/login  username='username' password='password'
  • csrftoken值放在标题中的X-CSRFToken
  • 即使有人使用email作为用户名归档,电子邮件输入也需要username名称参数(例如username='[email protected]')

响应:

1
302 FOUND sessionid="blahblah"
  • 如果未指定next值,它将自动重定向到/accounts/profile/,这可能会产生404错误

添加我们的观点:

1
2
3
4
5
6
7
8
9
from rest_framework_jwt.views import refresh_jwt_token

urlpatterns = [
    ...
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    ...
    url(r'^refresh-token/', refresh_jwt_token),
]