【问题标题】:DRF Token Authentication TutorialDRF 令牌认证教程
【发布时间】:2015-12-07 02:05:58
【问题描述】:

我对 Django 很陌生,但我想学习如何使用 Angularjs 实现 DRF 令牌身份验证。我发现的一些教程在展示如何设置它以及它们的源代码等方面并没有太大帮助......

另外,出于生产目的,使用第三方包是否更实用?或者设置我自己的(这是针对个人项目,所以时间贡献不是问题)。

我的令牌验证代码:Github

【问题讨论】:

  • 你想用 AngularJS 进行令牌认证吗?这个应用程序会部署在具有安全令牌存储的手机上吗?如果没有,为什么不使用会话、用户名/密码认证和 CSRF 保护?如果您是 Web 应用程序开发的新手,我相信令牌身份验证不是与用户交互时通常采用的路径。使用 DRF 进行令牌身份验证更多地用于移动应用程序或与 DRF 对话的非用户和非浏览器。
  • 我首先研究了这个,但有人向我提到,由于 REST api 的“无状态”性质,我应该使用令牌。对吗(如果有意义的话?)
  • 令牌就像一整套用来冒充一个人的钥匙。没有用户名。没有密码。令牌允许您像人一样行事,直到管理员(或您必须编写的某些进程/API)进入令牌表并撤销或删除令牌。因此,您必须用生命保护该令牌,如果有人窃取该令牌,他们可以冒充您的用户。
  • 同时,django 会话的默认超时时间为2 weeks。存储在您网站 cookie 中的会话 ID 受到浏览器的保护,免受外部恶意网站XSS 的驱动。如果他们最终通过对机器的物理访问、浏览器漏洞或man in the middle attack 获取会话 ID,则它的有效期为 2 周,而不是无限期或当您最终抓住入侵者时。如果您正在做一个网站,那么会议是您的最佳选择。

标签: angularjs django django-rest-framework


【解决方案1】:

在settings.py中

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'
)
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

在signals.py中

from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

在views.py中

class ExampleAuthToken(APIView):
    def post(self, request, format=None):
        username = request.data.get("username")
        password = request.data.get("password")
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            user = User.objects.create_user(username=username)
            user.set_password(password)
            user.save()
        content = {
            'user': unicode(user.username),
            'token': unicode(user.auth_token),
        }
        return Response(content)

在 urls.py 中

urlpatterns = [
    url(r'^authtoken/', ExampleAuthToken.as_view(), name='authtoken'),
]

使用 angularjs 调用;

var credentials = {
  username: "root",
  password: "root123"
};

$.post("http://localhost:8000/authtoken/", credentials {
    success: function(data){
          console.log(data);
    }
}

【讨论】:

  • 所以我实现了你的代码,但我不断收到 403 Forbidden 响应。我正在通过 $resource 发送 POST。有什么我可能会丢失的吗?我可以上传代码
  • 您在发帖时缺少 csrf_token。尝试发送 csrf 令牌。
  • 试试这个链接添加csrf令牌stackoverflow.com/questions/12823524/…
  • 我按照最近的帖子添加 $httpProvider.defaults.xsrfCookieName = 'csrftoken';我的配置文件中的 HeadersName = 'X-CSRFToken' 也是如此,但我仍然收到错误消息。我一直试图找出问题所在,但无济于事。
【解决方案2】:

我肯定会使用图书馆。对于令牌身份验证,有漂亮的 django-rest-framework-jwt - 安装和设置很简单。为了帮助 Angular JS 看起来有 drf-angular-jwt (它使用 DRF-JWT 但我没有使用它)。

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 2017-10-29
    • 2017-06-29
    • 2020-04-10
    • 2021-08-28
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多