如何使用 Django Rest Framework 创建登录 API?

     2023-02-24     66

关键词:

【中文标题】如何使用 Django Rest Framework 创建登录 API?【英文标题】:How do I create a login API using Django Rest Framework? 【发布时间】:2014-02-14 13:48:13 【问题描述】:

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

我的配置

urls.py

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

settings.py

REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )

我想要什么

请求:

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

回复:

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

【问题讨论】:

我打算使用 https 和基本身份验证推出 api。但是浏览器是否有一种安全的方式来存储身份验证凭据?我不希望用户在浏览离开然后浏览回我的网站时必须不断地重新登录。由于 csrf 令牌,我想取消会话身份验证......它们在 API 中管理起来很残酷。我想吃我的蛋糕,然后…… 假设浏览器提供了一个由域绑定的持久存储,只有所有者域可以访问,我想我可以将会话 ID 存储在持久存储中而不是 cookie 中,以防止我的 API 中的 CSRF 漏洞基于网站。 你找到方法了吗? 为了以后的读者,我做了一个关于这个主题的教程:michaelwashburnjr.com/django-user-authentication @mdw7326,“找不到页面。”这是给你的教程 【参考方案1】:

看看django-rest-framework-jwt的api视图。它是一种用于创建身份验证令牌而不是 cookie 会话的实现,但您的实现将是相似的。请参阅 views.py 和 serializers.py。您可能可以不加改动地使用serializers.py,只需调整您的视图以返回正确的参数并可能设置会话cookie(不记得是否已经在身份验证中执行过)。

【讨论】:

【参考方案2】:

如果你想要这样的东西,我会做同样的事情,但是我使用令牌身份验证。

查看他们的令牌页面here

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

我可以做我的网址localhost:8000/api/users/ -H Authorization : Token 然后,浏览器可以使用您在提供的 rest 框架 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,)

我希望这会有所帮助,但如果没有,祝您搜索顺利。

【讨论】:

我正在使用 django rest 框架令牌身份验证,我在提供用户名/密码后获得令牌,但我也想接收 user_id(用户的 pk)以及令牌,因此我可以保存在 localStorage 中,并在移动应用程序中需要时使用该 ID。请求令牌时获取用户主键的正确方法是什么? 使用 serializers.py 查看上述评论。您也许可以添加一个 pk 返回字段。如果那是您正在寻找的。​​span> 【参考方案3】:

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

请求:

POST /api/v1/login  username='username' password='password' 
csrftoken 值放在标题中的X-CSRFToken 中 即使有人使用email 作为用户名字段,电子邮件输入也需要username 名称参数(例如username='sample@domain.com'

回复:

302 FOUND sessionid="blahblah"
如果你没有指定next值,它会自动重定向到/accounts/profile/,这会产生404错误

【讨论】:

但是如何使用 SessionAuthentication lib 实现案例?我尝试但一直会话不保存,每当我在登录后输入新网址时,我都会得到 AnonymousUser 而不是保存的会话 在这种方法中,在哪里可以将 csrftoken 放入标头中?是否有一个单独的端点,我们使用 GET 请求获取令牌,或者我们应该将 GET 功能添加到我们的“/api/v1/login”端点?还是我错过了什么?谢谢你的回答,这是我能找到的唯一一个真正回答这个问题的人!【参考方案4】:

添加我们的观点:

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

【讨论】:

如何防止 Django Rest 中的暴力攻击 + 使用 Django Rest Throttling

】如何防止DjangoRest中的暴力攻击+使用DjangoRestThrottling【英文标题】:HowtopreventbruteforceattackinDjangoRest+UsingDjangoRestThrottling【发布时间】:2018-09-3020:15:23【问题描述】:在特定时间阻止特定用户使用DjangoRESTThrottling。我见过DjangoRESTTh... 查看详情

如何仅使用 django 作为后端并使用 django-rest-framework 发布

】如何仅使用django作为后端并使用django-rest-framework发布【英文标题】:Howtousedjangoonlyabackendandpostwithdjango-rest-framework【发布时间】:2016-11-2712:06:00【问题描述】:我将只使用Django作为后端。前端将使用React完成,没有django模板。我... 查看详情

Django 和 Django 休息框架

】Django和Django休息框架【英文标题】:DjangoandDjangorestframework【发布时间】:2021-11-2610:51:27【问题描述】:我正在关注资源https://blog.learncodeonline.in/how-to-integrate-razorpay-payment-gateway-with-django-rest-framework-and-reactjs而不是在前端使用reac... 查看详情

django-rest-framework-filters (query) 有啥方法可以使用 django-html“搜索”按钮为服务器的第一页工作吗?

】django-rest-framework-filters(query)有啥方法可以使用django-html“搜索”按钮为服务器的第一页工作吗?【英文标题】:Isthereanywaydjango-rest-framework-filters(query)workingusingdjango-html"search"buttonforthefirstpageofserver?django-rest-framewo 查看详情

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

】如何在django-rest-framework中为API使用TokenAuthentication【英文标题】:HowtouseTokenAuthenticationforAPIindjango-rest-framework【发布时间】:2013-07-0718:26:11【问题描述】:我有一个django项目,使用django-rest-framework来创建api。想要使用基于令牌的... 查看详情

Django - 如何使用 Django Rest Framework 按日期过滤?

】Django-如何使用DjangoRestFramework按日期过滤?【英文标题】:Django-HowtofilterbydatewithDjangoRestFramework?【发布时间】:2016-09-0802:41:57【问题描述】:我有一些带有时间戳字段的模型:models.pyclassEvent(models.Model):event_type=models.CharField(max_l... 查看详情

使用 Django 对象权限时,如何使用 django-rest 框架添加非模型/查询集返回视图?

】使用Django对象权限时,如何使用django-rest框架添加非模型/查询集返回视图?【英文标题】:HowcanIaddanon-model/querysetreturningviewwithdjango-restframeworkwhenusingDjangoObjectPermissions?【发布时间】:2016-03-0612:52:40【问题描述】:我有一个视图... 查看详情

如何使用 Django-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份​​验证

】如何使用Django-oauth-toolkit使用Django-rest-framework测试API端点以进行身份​​验证【英文标题】:HowtotestanAPIendpointwithDjango-rest-frameworkusingDjango-oauth-toolkitforauthentication【发布时间】:2015-02-2220:31:33【问题描述】:我有一个Django-rest-fr... 查看详情

如何在 Django REST 框架中使用事务?

】如何在DjangoREST框架中使用事务?【英文标题】:HowtousetransactionswithDjangoRESTframework?【发布时间】:2017-02-2212:07:10【问题描述】:我希望使用DjangoREST框架“一起”创建多个模型对象——即在单个事务中。目标是每个对象仅在事... 查看详情

如何使用 Django 通道为 Django Rest Api 打开 Websocket?

】如何使用Django通道为DjangoRestApi打开Websocket?【英文标题】:HowdoIuseDjangochannelstoopenaWebsocketforDjangoRestApi?【发布时间】:2020-05-2414:16:29【问题描述】:https://github.com/prateekamana/tempstack所以我有一个简单的应用程序,我想在我的反... 查看详情

如何使用 Django Rest Framework 在 Django 中进行操作日志记录

】如何使用DjangoRestFramework在Django中进行操作日志记录【英文标题】:HowtomakeactionlogginginDjangowithDjangoRestFramework【发布时间】:2017-05-2405:29:27【问题描述】:大家好!我需要使用DjangoRestFramework记录Django1.10.4中的操作并将它们保存... 查看详情

使用 Django Rest Framework 注册后如何自动登录?

】使用DjangoRestFramework注册后如何自动登录?【英文标题】:HowtoautologinaftersignupusingDjangoRestFramework?【发布时间】:2016-05-2709:31:26【问题描述】:我正在使用Django1.9和DRF3.0,这是我的看法:classUserList(generics.ListCreateAPIView):queryset=MyU... 查看详情

如何使用 Django REST 序列化器?

】如何使用DjangoREST序列化器?【英文标题】:HowtouseDjangoRESTSerializers?【发布时间】:2015-09-2811:32:01【问题描述】:所以,在阅读了DjangoRESTFramework文档和一堆教程之后,我仍然无法理解如何使用Django序列化程序将传入的POST(JSON)数... 查看详情

如何使用 django-rest-framework 进行社交登录? [关闭]

】如何使用django-rest-framework进行社交登录?[关闭]【英文标题】:Howexactlyworkasocialloginwithdjango-rest-framework?[closed]【发布时间】:2015-11-2916:50:57【问题描述】:我需要创建一个Web服务来登录用户。此Web服务将从Android或iOS应用程序调... 查看详情

如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件

】如何使用django-rest-auth和Mailgun从Django发送密码重置电子邮件【英文标题】:HowtosendpasswordresetemailfromDjangousingdjango-rest-authandMailgun【发布时间】:2019-05-2613:38:51【问题描述】:我正在使用Djangorestauth在Django中设置用户身份验证。大... 查看详情

如何使用 Django Rest Framework 向 ManyToMany 字段添加数据?

】如何使用DjangoRestFramework向ManyToMany字段添加数据?【英文标题】:HowtoadddatatoManyToManyfieldusingDjangoRestFramework?【发布时间】:2015-08-1318:37:17【问题描述】:我对DJango比较陌生,我希望使用来自rest框架的序列化程序将数据添加到多... 查看详情

如何使用 Django rest 框架来延长 JWT 会话令牌?

】如何使用Djangorest框架来延长JWT会话令牌?【英文标题】:HowdoIusetheDjangorestframeworktoprolongaJWTsessiontoken?【发布时间】:2021-11-2920:30:15【问题描述】:我将Django3.2与django.auth.contrib应用程序和djangorestframework-jwt==1.11.0一起使用。在收... 查看详情

如何使用 Django Rest Framework 删除对象

】如何使用DjangoRestFramework删除对象【英文标题】:HowtodeleteanobjectusingDjangoRestFramework【发布时间】:2014-12-1405:50:03【问题描述】:我正在尝试使用DjangoRestFramework为我的活动计划应用程序编写一个RESTfulAPI,但是在使用不期望GETHTTP... 查看详情