首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Django中一次获取访问令牌和刷新令牌( rest_framework_jwt )

在Django中使用 rest_framework_jwt 获取访问令牌和刷新令牌的功能,可以通过自定义视图和序列化器来实现。rest_framework_jwt 本身不直接支持刷新令牌的功能,但你可以通过扩展其功能来实现这一点。

以下是一个示例,展示如何在Django中一次获取访问令牌和刷新令牌。

安装依赖

首先,确保你已经安装了 djangorestframeworkdjangorestframework-jwt

代码语言:javascript
复制
pip install djangorestframework djangorestframework-jwt

配置 Django 设置

在你的 settings.py 文件中,添加 JWT 配置:

代码语言:javascript
复制
# settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_jwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

import datetime

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

创建自定义视图和序列化器

创建一个自定义视图和序列化器来处理访问令牌和刷新令牌的生成。

序列化器

创建一个新的序列化器来处理用户登录并返回访问令牌和刷新令牌。

代码语言:javascript
复制
# serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.serializers import JSONWebTokenSerializer

class CustomJWTSerializer(JSONWebTokenSerializer):
    def validate(self, attrs):
        credentials = {
            'username': attrs.get('username'),
            'password': attrs.get('password')
        }

        if all(credentials.values()):
            user = authenticate(**credentials)

            if user:
                if not user.is_active:
                    msg = 'User account is disabled.'
                    raise serializers.ValidationError(msg)

                payload = api_settings.JWT_PAYLOAD_HANDLER(user)
                token = api_settings.JWT_ENCODE_HANDLER(payload)
                refresh_token = api_settings.JWT_ENCODE_HANDLER(payload)

                return {
                    'token': token,
                    'refresh_token': refresh_token,
                    'user': user
                }
            else:
                msg = 'Unable to log in with provided credentials.'
                raise serializers.ValidationError(msg)
        else:
            msg = 'Must include "username" and "password".'
            raise serializers.ValidationError(msg)

视图

创建一个新的视图来处理登录请求并返回访问令牌和刷新令牌。

代码语言:javascript
复制
# views.py

from rest_framework_jwt.views import ObtainJSONWebToken
from .serializers import CustomJWTSerializer

class CustomObtainJSONWebToken(ObtainJSONWebToken):
    serializer_class = CustomJWTSerializer

URL 配置

在你的 urls.py 文件中添加新的 URL 路由来处理登录请求。

代码语言:javascript
复制
# urls.py

from django.urls import path
from .views import CustomObtainJSONWebToken

urlpatterns = [
    path('api-token-auth/', CustomObtainJSONWebToken.as_view(), name='token_obtain_pair'),
]

测试

现在,你可以通过发送 POST 请求到 /api-token-auth/ 来获取访问令牌和刷新令牌。

请求示例:

代码语言:javascript
复制
curl -X POST -d "username=<your_username>&password=<your_password>" http://localhost:8000/api-token-auth/

响应示例:

代码语言:javascript
复制
{
    "token": "<access_token>",
    "refresh_token": "<refresh_token>",
    "user": {
        "username": "<your_username>",
        "email": "<your_email>",
        ...
    }
}

结论

通过自定义视图和序列化器,你可以在Django中一次获取访问令牌和刷新令牌。这个示例展示了如何扩展 rest_framework_jwt 的功能,以满足你的需求。根据你的具体需求,你可能需要进一步调整和扩展这个示例。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django REST Framework-基于Oauth2的身份验证(一)

OAuth2是一种用于授权的开放标准,它允许用户授权第三方应用程序访问其资源,而无需将其凭据提供给该应用程序。...OAuth2是一种广泛使用的身份验证授权协议,许多大型服务Google、FacebookTwitter都使用了OAuth2。...本文将介绍如何在Django REST Framework中使用基于OAuth2的身份验证,包括安装配置django-oauth-toolkit,创建OAuth2客户端授权服务器,以及使用OAuth2...安装配置django-oauth-toolkit首先,我们需要安装django-oauth-toolkit库。...用于设置访问令牌刷新令牌的过期时间,ROTATE_REFRESH_TOKEN用于控制是否在使用新的刷新令牌时将旧的刷新令牌加入黑名单,ALLOWED_REDIRECT_URI_SCHEMES用于设置允许的重定向

2.6K10

六种Web身份验证方法比较Flask示例代码

登录注销教程 Django 基于会话的单页应用身份验证 FastAPI-Users: Cookie Auth 基于令牌的身份验证 此方法使用令牌(而不是 Cookie)对用户进行身份验证。...这意味着,如果令牌泄露,攻击者可能会滥用它直到到期。因此,将令牌到期时间设置为非常小的时间( 15 分钟)非常重要。 需要将刷新令牌设置为在到期时自动颁发令牌。...,并相应地授予访问权限 TOTP的工作原理: 客户端发送用户名密码 凭据验证后,服务器使用随机生成的种子生成随机代码,将种子存储在服务器端,并将代码发送到受信任的系统 用户在受信任的系统上获取代码,然后将其输入回...包 PyOTP - Python 一性密码库 django-otp 代码 PyOTP 软件包提供基于时间基于计数器的 OTP。...IETF:一性密码系统 实现2FA:基于时间的一性密码实际工作原理(使用Python示例) OAuth OpenID OAuth/OAuth2 OpenID 分别是授权身份验证的流行形式

7.2K40

Django REST Framework-基于Oauth2的身份验证(二)

下面是使用OAuth2进行身份验证的步骤:第一步:获取授权码在OAuth2身份验证流程的第一步中,我们需要从授权服务器获取授权码。授权码是用于获取访问令牌的一性代码。...如果用户授予请求的授权,授权服务器将向用户返回授权码,该授权码可以在下一步中用于获取访问令牌。第二步:获取访问令牌在OAuth2身份验证流程的第二步中,我们需要使用授权码获取访问令牌。...访问令牌用于验证API请求。要获取访问令牌,请使用OAuth2客户端的凭据授权码向授权服务器的令牌端点发出POST请求。...、刷新令牌过期时间。...如果访问令牌有效,则返回相关用户访问令牌。如果访问令牌无效,则引发AuthenticationFailed异常。

1.9K20

分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南

介绍 刷新令牌允许用户无需重新进行身份验证即可获取新的访问令牌,从而确保更加无缝的身份验证体验。这是通过使用长期刷新令牌获取新的访问令牌来完成的,即使原始访问令牌已过期也是如此。...刷新令牌具有较长的生命周期,用于在原始访问令牌过期后获取新的访问令牌。 当访问令牌过期时,客户端将刷新令牌发送到服务器,然后服务器验证刷新令牌并生成新的访问令牌。...访问令牌用于访问受保护的资源,例如 API,而刷新令牌用于在当前访问令牌过期时获取新的访问令牌。 当 JWT 用作访问令牌时,它通常使用用户的声明令牌的过期时间进行编码。...以下是应用程序如何在 Node.js 应用程序中使用 JWT 刷新令牌的示例: 用户登录到应用程序并将其凭据发送到身份验证服务器。 身份验证服务器验证凭据,生成 JWT 访问令牌 JWT 刷新令牌。...该脚本首先向令牌端点发出初始请求以获取访问令牌刷新令牌。然后,对访问令牌进行解码以获取过期时间,并在向受保护端点发出请求之前检查该过期时间。

25230

浏览器中存储访问令牌的最佳实践

问题是,如何在JavaScript中获取这样的访问令牌?当您获取一个令牌时,应用程序应该在哪里存储令牌,以便在需要时将其添加到请求中?...XSS攻击可用于窃取访问令牌刷新令牌,或执行CSRF攻击。不过,XSS攻击有一个时间窗口,因为它们只能在有限的时间段内运行,令牌的有效期内,或者打开的选项卡存在漏洞的时长。...因此,它们可以拦截请求和响应,例如缓存数据启用离线访问,或者获取添加令牌。...在使用JavaScript闭包或服务工作者处理令牌API请求时,XSS攻击可能会针对OAuth流程,回调流或静默流来获取令牌。...刷新令牌必须只在刷新过期的访问令牌时添加。这意味着包含刷新令牌的cookie与包含访问令牌的cookie有稍微不同的设置。

16810

何在微服务架构中实现安全性?

OAuth 2.0中的关键概念如下: ■授权服务器:提供用于验证用户身份以及获取访问令牌刷新令牌的 API。SpringOAuth是一个很好的用来构建OAuth 2.0授权服务器的框架。...■刷新令牌:客户端用于获取新的AccessToken的长效但同时也可被可撤消的令牌。 ■资源服务器:使用访问令牌授权访问的服务。在微服务架构中,服务是资源服务器。...身份验证服务器验证客户端的凭据,并返回访问令牌刷新令牌。 4. APIGateway 将访问令牌刷新令牌返回给客户端,通常是采用 cookie 的形式。 5....客户端在向 API Gateway 发出的请求中包含访问令牌刷新令牌。 6....如果访问令牌已经过期或即将过期,API Gateway 将通过发出 OAuth 2.0 刷新授权请求来获取新的访问令牌(www.oauth.com/oauth2-servers/access-tokens

4.8K30

微服务架构如何保证安全性?

OAuth 2.0 中的关键概念如下: 1、授权服务器:提供用于验证用户身份以及获取访问令牌刷新令牌的 API。Spring OAuth是一个很好的用来构建OAuth 2.0授权服务器的框架。...3、刷新令牌:客户端用于获取新的AccessToken的长效但同时也可被可撤消的令牌。 4、资源服务器:使用访问令牌授权访问的服务。在微服务架构中,服务是资源服务器。...身份验证服务器验证客户端的凭据,并返回访问令牌刷新令牌。 4. API Gateway 将访问令牌刷新令牌返回给客户端,通常是采用 cookie 的形式。 5....客户端在向 API Gateway 发出的请求中包含访问令牌刷新令牌。 6....如果访问令牌已经过期或即将过期,API Gateway 将通过发出 OAuth 2.0 刷新授权请求来获取新的访问令牌(www.oauth.com/oauth2-servers/access-tokens

5.1K40

OAuth2简化模式

相对于授权码模式,简化模式的实现更为简单,但安全性也相应较低,因为客户端会直接从认证服务器获取访问令牌,而不是通过中间步骤获取。...(E)认证服务器验证客户端身份授权码的有效性,如果通过验证,则直接将访问令牌作为 URL 锚点的一部分返回给客户端,例如:https://client.example.com/cb#access_token...用户体验良好:用户在进行身份验证后,无需再次输入用户名密码,直接获得访问令牌,从而提高了用户体验。...缺点安全性较低:因为客户端会直接从认证服务器获取访问令牌,而不是通过中间步骤获取,容易受到 CSRF 攻击等安全威胁。...不支持刷新令牌:由于没有授权码的参与,简化模式无法使用授权码来获取刷新令牌,因此无法支持刷新令牌的功能。令牌泄露风险:访问令牌存储在前端客户端中,容易被窃取或泄露,从而导致令牌被盗用。

1.8K10

何在微服务架构中实现安全性?

OAuth 2.0 中的关键概念如下: 授权服务器:提供用于验证用户身份以及获取访问令牌刷新令牌的 API。Spring OAuth 是一个很好的用来构建 OAuth 2.0 授权服务器的框架。...刷新令牌:客户端用于获取新的 AccessToken 的长效但同时也可被可撤消的令牌。 资源服务器:使用访问令牌授权访问的服务。在微服务架构中,服务是资源服务器。 客户端:想要访问资源服务器的客户端。...身份验证服务器验证 API 客户端的凭据,并返回访问令牌刷新令牌。 API Gateway 在其对服务的请求中包含访问令牌。服务验证访问令牌并使用它来授权请求。...身份验证服务器验证客户端的凭据,并返回访问令牌刷新令牌。 API Gateway 将访问令牌刷新令牌返回给客户端,通常是采用 cookie 的形式。...客户端在向 API Gateway 发出的请求中包含访问令牌刷新令牌

4.5K40

从0开始构建一个Oauth2Server服务 发起认证请求

某些服务将使用 JWT 等结构化令牌作为其访问令牌自编码访问令牌中所述,但在这种情况下,客户端无需担心解码令牌。 事实上,尝试解码访问令牌是危险的,因为服务器不保证访问令牌将始终保持相同的格式。...有关使用刷新令牌获取访问令牌的更多详细信息,请参见下文。 如果您想了解有关登录用户的更多信息,您应该阅读特定服务的 API 文档以了解他们的建议。...这对于没有客户端密钥的客户端尤其重要,因为刷新令牌成为获取访问令牌所需的唯一东西。...当刷新令牌在每次使用后发生变化时,如果授权服务器检测到刷新令牌被使用了两,则意味着它可能已被复制并被Attack者使用,授权服务器可以撤销所有访问令牌相关的刷新令牌立即使用它。...如果刷新令牌因任何原因过期,那么应用程序可以采取的唯一操作是要求用户重新登录,从头开始新的 OAuth 流程,这将向应用程序颁发新的访问令牌刷新令牌

15430

从五个方面入手,保障微服务应用安全

访问令牌时间较短2分钟,刷新令牌为一令牌有效期略长30分,如果存在已作废的刷新令牌换取访问令牌的请求,授权端点也能够及时发现做出相应入侵处理,注销该用户的所有刷新令牌。...匹配成功后,授权服务器IAM响应返回访问令牌与可选的刷新令牌给网关。...访问令牌失效后,网关根据自己的客户端凭证+刷新令牌一起发送授权服务器,获取新的访问令牌刷新令牌,并再返回响应中将访问令牌写入到用户浏览器的存储中。...基于上述风险问题,移动App基于授权码获取访问令牌的流程需要进行优化解决,rfc规范中建议的实现方案是移动App授权流程采用使用带有PKCE支持的授权码模式。...特权App对授权服务器颁发的访问令牌刷新令牌进行存储更新。

2.6K20

8种至关重要OAuth API授权流与能力

由于这是针对公共客户端的,因此将不会发出刷新令牌。这意味着只有让用户参与才能接收新的访问令牌。 白小白: 实际上隐式流在很多文档中也称为简化流,相对于认证码授权流,少了第一个获取CODE的过程。...其二是通过这种方式授权访问的是与用户个人无关的相关信息,也就是不需要有用户点击“允许获取昵称头像”这个过程。微信公众平台的很多API即是此类,获得获取用户增减的统计数据。...可以撤销访问令牌,这将被视作是当前会话的结束。如果存在刷新令牌,则该令牌仍然有效。撤销刷新令牌将使刷新令牌无效,并使其附带的任何活动的访问令牌无效。...白小白: 这里面涉及“代理”的概念,一代理代表客户端以授权的用户身份执行某种操作。而一代理过程中可能获得多次令牌,包括访问令牌刷新令牌。 ?...2、如果某一个当前有效的刷新令牌被撤销了,则所有访问刷新令牌都会撤销,也就是这一代理都被撤销 3、如果通过某一个刷新令牌X获得了新的访问令牌新的刷新令牌

1.6K10

Spring Security----JWT详解

那么你登录的时候访问甲,而获取接口数据的时候访问乙,就无法保证session的唯一性共享性。...另外,我们需要写一个工具类JwtTokenUtil,该工具类的主要功能就是根据用户信息生成JWT,解签JWT获取用户信息,校验令牌是否过期,刷新令牌等。...当用户第一登陆之后,我们将JWT令牌返回给了客户端,客户端应该将该令牌保存起来。...---- 测试 测试登录接口,即:获取token的接口。输入正确的用户名、密码即可获取token。 下面我们访问一个我们定义的简单的接口“/hello”,但是不传递JWT令牌,结果是禁止访问。...要想使用JWT访问资源需要 先使用用户名密码,去Controller换取JWT令牌 然后才能进行资源的访问,资源接口的前端由一个"JWT验证Filter"负责校验令牌授权访问

2.5K21

OAuth2.0 OpenID Connect 一

许多 OIDC 实施者也会将 JWT 用于访问刷新令牌,但这不是由规范规定的。 Access Token 访问令牌用作不记名令牌。持有者令牌意味着持有者无需进一步识别即可访问授权资源。...让我们使用过期的访问令牌再试一: http https://micah.oktapreview.com/oauth2/......", "updated_at": 1490198843, "zoneinfo": "America/Los_Angeles" } refresh-tokens 刷新令牌用于获取新的访问令牌...这是一个典型的场景: 用户登录并取回访问令牌刷新令牌 应用程序检测到访问令牌已过期 应用程序使用刷新令牌获取新的访问令牌 重复 2 3,直到刷新令牌过期 刷新令牌过期后,用户必须重新进行身份验证...这是一个快速参考: ID token 携带在 token 本身编码的身份信息,必须是 JWT 访问令牌用于通过将资源用作不记名令牌获取对资源的访问权限 刷新令牌的存在仅仅是为了获得更多的访问令牌

35530

构建Vue项目-身份验证

storage.service.js中的代码如下所示: const TOKEN_KEY = 'access_token' const REFRESH_TOKEN_KEY = 'refresh_token' /** * 管理访问令牌存储获取...补充:如何刷新过期的访问令牌? 关于身份验证,要处理令牌刷新或401错误(token失效)比较困难,因此被许多教程所忽略。...在某些情况下,最好是在发生401错误时简单地注销用户,但是让我们看看如何在不中断用户体验的情况下刷新访问令牌。这是上面提到的代码示例中的401拦截器。...如果访问令牌到期,所有请求将失败,并因此触发401拦截器中的令牌刷新。从长远来看,这将刷新每个请求的令牌,这样不太好。...通过保存刷新令牌promise,并向每个刷新令牌请求返回相同的promise,我们可以确保令牌刷新。 您还需要在设置请求header之后立即在main.js中安装401拦截器。

7K20

从0开始构建一个Oauth2Server服务 单页应用

这在当时是有道理的,因为众所周知,隐式流的安全性较低,并且如果没有客户端密钥,刷新令牌可以无限期地用于获取新的访问令牌,因此这比泄漏的风险更大访问令牌。...也几乎不需要刷新令牌,因为 JavaScript 应用程序只会在用户积极使用浏览器时运行,因此它们可以在需要时重定向到授权服务器以获取新的访问令牌。...具体来说,刷新令牌必须仅对一使用有效,并且授权服务器必须在每次发布新的访问令牌以响应刷新令牌授予时发布一个新的刷新令牌。...这为授权服务器提供了一种检测刷新令牌是否已被攻Attack复制使用的方法,因为在应用程序的正常运行中,刷新令牌只会被使用一。...如果您的应用程序属于这种架构模式,那么最好的选择是将所有 OAuth 流程移动到服务器组件,并将访问令牌刷新令牌完全保留在浏览器之外。

19530

使用OAuth 2.0访问谷歌的API

使用OAuth 2.0访问谷歌的API 谷歌的API使用的OAuth 2.0协议进行身份验证授权。谷歌支持常见的OAuth 2.0场景,那些Web服务器,安装,客户端应用程序。...访问 谷歌API控制台 获取的OAuth 2.0凭据已知的谷歌和你的应用程序客户端ID客户端密钥。设定值的变化基于你正在建设什么类型的应用程序。...方案 Web服务器应用程序 该谷歌的OAuth 2.0端点支持的Web服务器应用程序使用的语言和框架,PHP,JavaPythonRuby,ASP.NET。...用户批准的访问后,从谷歌服务器的响应中包含的访问令牌刷新令牌。应用程序应该保存令牌以供将来使用刷新和使用令牌访问谷歌的API访问。一旦访问令牌过期后,应用程序使用令牌来获得一个新的刷新。...服务帐户的凭据,您从谷歌API控制台获取,包括生成的电子邮件地址,它是独一无二的,客户端ID,以及至少一个公钥/私钥对。您可以使用客户端ID一个私钥来创建签名JWT,构建以适当的格式的访问令牌请求。

4.4K10

微服务统一认证与授权的 Go 语言实现(下)

比如在客户端使用密码类型请求访问令牌,那我们需要对客户端携带的用户名密码进行校验, UsernamePasswordTokenGranter 密码类型的 TokenGranter 的代码所示: func...,我们使用 UUID 来生成一个唯一的标识来区分不同的访问令牌刷新令牌,并根据客户端信息中提供的访问令牌刷新令牌的有效时长计算令牌的有效时间,最后还使用可能存在的 TokenEnhancer 来进行令牌样式的状态...生成访问令牌是与请求的客户端用户信息相绑定,在验证访问令牌的有效性时,可以根据访问令牌逆向获取到客户端信息用户信息,这样才能通过访问令牌确定当前的操作用户委托的客户端。...如果访问令牌没有失效,再通过 TokenStore 获取生成访问令牌时绑定的用户信息客户端信息。...再根据刷新令牌获取刷新令牌绑定的用户信息客户端信息,最后我们移除已使用的刷新令牌,并根据用户信息客户端信息生成新的刷新令牌访问令牌返回。

1.5K20
领券