JWT安装配置

本文详细介绍了如何在Django项目中配置JWT,包括安装JWT库、设置有效期、整合DRF进行认证权限配置、创建获取和刷新token的接口,以及在postman中测试相关接口。同时,文章还提供了源码分析,帮助理解JWT的实现过程。
部署运行你感兴趣的模型镜像
1.登录接口
2.刷新接口
3.自定义返回格式
  • 可用地方
'''第一:提供三个视图函数'''
# obtain_jwt_token = ObtainJSONWebToken.as_view()      # 获取token
# refresh_jwt_token = RefreshJSONWebToken.as_view()    # 刷新token
# verify_jwt_token = VerifyJSONWebToken.as_view()      # 修改token
'''第二:jwt_response_payload_handler可以重写返回'''

1.JWT安装配置

1.1 安装JWT

pip install djangorestframework-jwt==1.11.0

1.2 syl/settings.py配置jwt载荷中的有效期设置


# jwt载荷中的有效期设置
JWT_AUTH = {
    # 1.token前缀:headers中 Authorization 值的前缀
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    # 2.token有效期:一天有效
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # 3.刷新token:允许使用旧的token换新token,接口对接需要设置为true
    'JWT_ALLOW_REFRESH': True,
    # 4.token有效期:token在24小时内过期, 可续期token
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(hours=24),
    # 5.自定义JWT载荷信息:自定义返回格式,需要手工创建
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'user.utils.jwt_response_payload_handler',
}

1.3 syl/settings.pyJWT结合DRF进行认证权限配置

# 在DRF配置文件中开启认证和权限
REST_FRAMEWORK = {
    ...
    # 用户登陆认证方式
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',    # 在DRF中配置JWT认证
        # 'rest_framework.authentication.SessionAuthentication',  # 使用session时的认证器
        # 'rest_framework.authentication.BasicAuthentication'     # 提交表单时的认证器
    ],
    # 权限配置, 顺序靠上的严格
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.IsAdminUser',                # 管理员可以访问
        'rest_framework.permissions.IsAuthenticated',              # 全局配置只有认证用户可以访问接口
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly',  # 认证用户可以访问, 否则只能读取
        # 'rest_framework.permissions.AllowAny',                   # 所有用户都可以访问
    ],
    ...
}

1.4 user/urls.py增加获取token接口和刷新token接口

from django.urls import include, path
from rest_framework.authtoken.views import obtain_auth_token

from user import views
from rest_framework.routers import SimpleRouter, DefaultRouter
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token

# 自动生成路由方法, 必须使用视图集
# router = SimpleRouter()  # 没有根路由  /user/ 无法识别
router = DefaultRouter()   # 有根路由
router.register(r'user', views.UserViewSet)

urlpatterns = [
    path('index/', views.index),          # 函数视图
    path('login/', obtain_jwt_token),     # 获取token,登录视图
    path('refresh/', refresh_jwt_token),  # 刷新token
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),  # 认证地址
]

urlpatterns += router.urls  # 模块地址
# print(router.urls)

# obtain_jwt_token = ObtainJSONWebToken.as_view()      # 获取token
# refresh_jwt_token = RefreshJSONWebToken.as_view()    # 刷新token
# verify_jwt_token = VerifyJSONWebToken.as_view()      # 修改token

1.5 在user/utils.py中从写jwt_response_payload_handler

def jwt_response_payload_handler(token, user=None, request=None, role=None):
    """
    自定义jwt认证成功返回数据
    :token  返回的jwt
    :user   当前登录的用户信息[对象]
    :request 当前本次客户端提交过来的数据
    :role 角色
    """
    if user.first_name:
        name = user.first_name
    else:
        name = user.username
    return {
        'authenticated': 'true',
        'id': user.id,
        "role": role,
        'name': name,
        'username': user.username,
        'email': user.email,
        'token': token,
    }

2.postman测试接口

2.1 测试登录接口,获取token

http://192.168.56.100:8888/user/login/

在这里插入图片描述

'''自定义认证和权限优先级更高,可以覆盖settings.py中的 '''
# 自定义权限类
permission_classes = (MyPermission,)
# 自定义认证类, 自定义会覆盖全局配置
authentication_classes = (JSONWebTokenAuthentication,)

2.2 使用获得的token获取所有用户信息

http://192.168.56.100:8888/user/user/

在这里插入图片描述

3.源码分析

class JSONWebTokenAPIView(APIView):
    """
    Base API View that various JWT interactions inherit from.
    """
    permission_classes = ()
    authentication_classes = ()

    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'view': self,
        }

    def get_serializer_class(self):
        """
        Return the class to use for the serializer.
        Defaults to using `self.serializer_class`.
        You may want to override this if you need to provide different
        serializations depending on the incoming request.
        (Eg. admins get full serialization, others get basic serialization)
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__)
        return self.serializer_class

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            user = serializer.object.get('user') or request.user   # User表对象
            token = serializer.object.get('token')                 # 获取到生成的token
            response_data = jwt_response_payload_handler(token, user, request)
            response = Response(response_data)
            if api_settings.JWT_AUTH_COOKIE:
                expiration = (datetime.utcnow() +
                              api_settings.JWT_EXPIRATION_DELTA)
                response.set_cookie(api_settings.JWT_AUTH_COOKIE,
                                    token,
                                    expires=expiration,
                                    httponly=True)
            return response

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

<think>我们正在处理一个关于在Node.js中安装配置JWT模块的问题。根据用户的问题,我们需要提供安装步骤和基本配置方法。 根据引用[1], [2], [3], [4]中提供的信息,我们可以总结如下: 1. 安装包:使用npm安装两个包:jsonwebtoken和express-jwt(或现在推荐使用的express-jwt的替代品,因为express-jwt在较新版本中可能有变化,但根据引用内容,用户使用了express-jwt)。 2. 定义密钥:需要定义一个密钥(secretKey)用于签名和验证令牌。 3. 生成JWT:使用jsonwebtoken的sign方法。 4. 验证JWT:使用express-jwt中间件来验证请求中的令牌,或者使用jsonwebtoken的verify方法手动验证。 注意:引用[3]中使用了单独的加密和解密函数示例,引用[4]提到了在Express中使用JWT的简单教程。 根据当前的最佳实践,我们通常使用jsonwebtoken来生成和验证令牌,而对于Express中间件,express-jwt曾经是常用的,但现在更推荐使用`jsonwebtoken`的验证方法或使用其他库(如`jwt-express`)?但根据引用[1]和[3],他们使用了express-jwt和jsonwebtoken的组合。 然而,值得注意的是,express-jwt库在最近版本中已经更名为`express-jwt`,并且需要配合`jwks-rsa`(如果使用RSA非对称加密)或者直接使用密钥。但根据引用内容,他们使用的是对称密钥(secretKey)。 因此,我们将按照以下步骤回答: 1. 安装必要的包。 2. 配置密钥。 3. 创建生成JWT和验证JWT的示例(包括作为Express中间件)。 但是用户只问了安装配置,所以我们先回答安装和基本配置。 另外,根据引用[1]的代码示例,安装命令是: npm i jsonwebtoken express-jwt 但是,请注意,express-jwt在v6版本之后有一些变化,它现在需要从`express-jwt`中导入,并且使用方式略有不同。不过,我们根据引用的代码示例,使用旧版本的写法(因为引用中使用了`expressJWT`作为中间件函数,而新版本中改成了`expressjwt`)。 为了确保兼容性,我们可以建议用户安装特定版本,或者按照当前常用的方法。 实际上,根据npm官方文档,目前(2023年)express-jwt的常用版本是v6以上,它使用ESM模块,并且需要异步初始化。但为了简单起见,我们可以使用引用中的方式(因为引用中的代码是有效的)。 因此,我们按照引用[1]和[3]的方式给出示例。 步骤: 1. 安装包 2. 引入模块 3. 定义密钥 4. 使用jsonwebtoken生成令牌 5. 使用express-jwt中间件验证请求(可选,如果用于Express应用) 注意:用户可能只需要生成和验证令牌,而不一定需要中间件。所以我们将提供两部分:基本使用和中间件使用。 由于用户问题只要求安装配置,我们重点放在安装和基本配置上。 回答结构: 1. 安装步骤 2. 基本配置(密钥设置) 3. 生成JWT的示例 4. 验证JWT的示例(单独验证和作为中间件) 5. 注意事项(如密钥安全、过期时间等) 同时,根据系统指令,我们需要生成相关问题。 引用标识:我们在引用的地方添加引用标识,如[^1]。</think>### 在 Node.js 中安装配置 JWT 模块 #### 1. **安装依赖包** 在项目根目录执行以下命令安装必需的包: ```bash npm install jsonwebtoken express-jwt ``` - `jsonwebtoken`:用于生成/验证 JWT 令牌[^1][^2] - `express-jwt`:Express 中间件,用于自动验证请求中的 JWT[^1][^4] --- #### 2. **基本配置** 在入口文件(如 `app.js`)中添加配置: ```javascript const jwt = require('jsonwebtoken'); const expressJWT = require('express-jwt'); // 1. 设置密钥(重要!需保密且足够复杂) const secretKey = '@#!$MySuperSecretKey_123%^&*'; // 替换为你的密钥 // 2. 配置 JWT 验证中间件 app.use(expressJWT({ secret: secretKey, algorithms: ['HS256'] // 指定加密算法 }).unless({ path: ['/login'] // 排除不需要验证的路径(如登录接口) })); ``` > **密钥安全建议**: > - 使用环境变量存储密钥(如 `process.env.JWT_SECRET`) > - 长度建议至少 32 字符,包含大小写字母、数字、特殊符号[^1][^3] --- #### 3. **生成 JWT 令牌** 在登录验证成功后生成令牌: ```javascript // 用户登录成功时 app.post('/login', (req, res) => { // 1. 验证用户名密码(此处简化) const user = { id: 1, username: 'admin' }; // 2. 生成 JWT(有效期 2 小时) const token = jwt.sign( { id: user.id, username: user.username }, secretKey, { expiresIn: '2h' } // 过期时间 ); res.send({ status: 200, token }); // 返回给客户端 }); ``` --- #### 4. **验证与获取令牌数据** ##### 方式 1:中间件自动验证(推荐) ```javascript // 受保护的路由(自动验证 JWT) app.get('/profile', (req, res) => { // 直接从 req.user 获取解密后的数据 res.send(`欢迎 ${req.user.username}`); }); ``` ##### 方式 2:手动验证令牌 ```javascript function verifyToken(token) { try { return jwt.verify(token, secretKey); // 返回解密数据 } catch (err) { console.error('令牌无效:', err.message); return null; } } // 使用示例 const payload = verifyToken('eyJhbGci...'); if(payload) console.log(payload.username); ``` --- #### 5. **错误处理** 添加全局错误捕获中间件: ```javascript app.use((err, req, res, next) => { if (err.name === 'UnauthorizedError') { res.status(401).send('无效的令牌'); // JWT 验证失败 } }); ``` --- ### 关键配置说明 | 配置项 | 说明 | |----------------|----------------------------------------------------------------------| | `secretKey` | **必须** 使用高强度密钥(建议通过 `crypto.randomBytes(32).toString('hex')` 生成) | | `algorithms` | 指定加密算法(HS256/RS256 等),需与签发时一致[^1] | | `expiresIn` | 令牌有效期(格式:`120`、`"2 days"`、`"10h"`)[^2][^3] | | `.unless()` | 配置免验证路径(如登录/注册接口)[^1] | > **安全建议**: > - 生产环境务必通过 HTTPS 传输 JWT > - 避免在令牌中存储敏感数据(如密码) > - 定期轮换密钥(需兼容新旧令牌)[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值