mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-05-23 23:34:25 +00:00
* [Update] 统一url地址 * [Update] 修改api * [Update] 使用规范的签名 * [Update] 修改url * [Update] 修改swagger * [Update] 添加serializer class避免报错 * [Update] 修改token * [Update] 支持api key * [Update] 支持生成api key * [Update] 修改api重定向 * [Update] 修改翻译 * [Update] 添加说明文档 * [Update] 修复浏览器关闭后session不失效的问题 * [Update] 修改一些内容 * [Update] 修改 jms脚本 * [Update] 修改重定向 * [Update] 修改搜索trim * [Update] 修改搜索trim * [Update] 添加sys log * [Bugfix] 修改登陆错误 * [Update] 优化User操作private_token的接口 (#3091) * [Update] 优化User操作private_token的接口 * [Update] 优化User操作private_token的接口 2 * [Bugfix] 解决授权了一个节点,当移动节点后,被移动的节点下的资产会放到未分组节点下的问题 * [Update] 升级jquery * [Update] 默认使用page * [Update] 修改使用Orgmodel view set * [Update] 支持 nv的硬盘 https://github.com/jumpserver/jumpserver/issues/1804 * [UPdate] 解决命令执行宽度问题 * [Update] 优化节点 * [Update] 修改nodes过多时创建比较麻烦 * [Update] 修改导入 * [Update] 节点获取更新 * [Update] 修改nodes * [Update] nodes显示full value * [Update] 统一使用nodes select2 函数 * [Update] 修改磁盘大小小数 * [Update] 修改 Node service * [Update] 优化授权节点 * [Update] 修改 node permission * [Update] 修改asset permission * [Stash] * [Update] 修改node assets api * [Update] 修改tree service,支持资产数量 * [Update] 修改暂时完成 * [Update] 修改一些bug
90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
from django.core.cache import cache
|
|
from rest_framework import serializers
|
|
|
|
from users.models import User
|
|
from .models import AccessKey
|
|
|
|
|
|
__all__ = [
|
|
'AccessKeySerializer', 'OtpVerifySerializer', 'BearerTokenSerializer',
|
|
'MFAChallengeSerializer',
|
|
]
|
|
|
|
|
|
class AccessKeySerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
model = AccessKey
|
|
fields = ['id', 'secret', 'is_active', 'date_created']
|
|
read_only_fields = ['id', 'secret', 'date_created']
|
|
|
|
|
|
class OtpVerifySerializer(serializers.Serializer):
|
|
code = serializers.CharField(max_length=6, min_length=6)
|
|
|
|
|
|
class BearerTokenMixin(serializers.Serializer):
|
|
token = serializers.CharField(read_only=True)
|
|
keyword = serializers.SerializerMethodField()
|
|
date_expired = serializers.DateTimeField(read_only=True)
|
|
|
|
@staticmethod
|
|
def get_keyword(obj):
|
|
return 'Bearer'
|
|
|
|
def create_response(self, username):
|
|
request = self.context.get("request")
|
|
try:
|
|
user = User.objects.get(username=username)
|
|
except User.DoesNotExist:
|
|
raise serializers.ValidationError("username %s not exist" % username)
|
|
token, date_expired = user.create_bearer_token(request)
|
|
instance = {
|
|
"username": username,
|
|
"token": token,
|
|
"date_expired": date_expired,
|
|
}
|
|
return instance
|
|
|
|
def update(self, instance, validated_data):
|
|
pass
|
|
|
|
|
|
class BearerTokenSerializer(BearerTokenMixin, serializers.Serializer):
|
|
username = serializers.CharField()
|
|
password = serializers.CharField(write_only=True, allow_null=True,
|
|
required=False)
|
|
public_key = serializers.CharField(write_only=True, allow_null=True,
|
|
required=False)
|
|
|
|
def create(self, validated_data):
|
|
username = validated_data.get("username")
|
|
return self.create_response(username)
|
|
|
|
|
|
class MFAChallengeSerializer(BearerTokenMixin, serializers.Serializer):
|
|
req = serializers.CharField(write_only=True)
|
|
auth_type = serializers.CharField(write_only=True)
|
|
code = serializers.CharField(write_only=True)
|
|
|
|
def validate_req(self, attr):
|
|
username = cache.get(attr)
|
|
if not username:
|
|
raise serializers.ValidationError("Not valid, may be expired")
|
|
self.context["username"] = username
|
|
|
|
def validate_code(self, code):
|
|
username = self.context["username"]
|
|
user = User.objects.get(username=username)
|
|
ok = user.check_otp(code)
|
|
if not ok:
|
|
msg = "Otp code not valid, may be expired"
|
|
raise serializers.ValidationError(msg)
|
|
|
|
def create(self, validated_data):
|
|
username = self.context["username"]
|
|
return self.create_response(username)
|
|
|