RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1609491
Accepted
supreme1444 вас
supreme1444 вас
Asked:2025-03-28 14:06:20 +0000 UTC2025-03-28 14:06:20 +0000 UTC 2025-03-28 14:06:20 +0000 UTC

通过 ESIA 授权存在问题

  • 772

该问题特定于版本 v2。 v1 工作正常,但无法与第二个版本连接。我们无法获取第一个授权码。一切看上去都符合文献记载,尽管它极其歪曲。我将用 Python 发布代码。谁能告诉我。错误 error_description":"ESIA-007053: OAuthErrorEnum.clientSecretWrong

def sign_params_for_v2_by_csptest(client_secret_raw):
    """

    :param client_secret_raw: Сформированный для подписания файл
    :return: 
    """
    thumbprint = ""
    tmp_dir = tempfile.gettempdir()
    source_file = tempfile.NamedTemporaryFile(mode='w', delete=False, dir=tmp_dir)
    source_file.write(client_secret_raw)
    source_file.close()
    source_path = source_file.name
    destination_path = source_path + ".sig"
    cmd = (f'/opt/cprocsp/bin/amd64/csptest -keys -sign GOST12_256 -cont "имя контейнера" -keytype exchange -in {source_path} -out {destination_path}')
    os.system(cmd)
    signed_message = open(destination_path, 'rb').read()
    os.unlink(source_path)

    os.unlink(destination_path)
    """
    Возвращает base64url подписанное значение
    """
    return base64.urlsafe_b64encode(signed_message).decode('utf-8')
TIMESTAMP = get_timestamp()
CLIENT_ID = "имя"
SCOPE = "openid"
SCOPE_ORG = "org_inn"
REDIRECT_URI = "урл"
SERVICE_URL = "https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac"
STATE = str(uuid.uuid4())
#Формируем client для подписания
client_secret_raw = (
    CLIENT_ID +
    SCOPE.replace(" ", "") +
    SCOPE_ORG +
    TIMESTAMP +
    STATE +
    REDIRECT_URI
)

client_secret = sign_params_for_v2_by_csptest(client_secret_raw)
client_hash = "hash через calc_cert_hash_unix"

params_url = {
    "client_id": CLIENT_ID,
    "scope": SCOPE,
    "scope_org": SCOPE_ORG,
    "timestamp": TIMESTAMP,
    "state": STATE,
    "redirect_uri": REDIRECT_URI,
    "client_secret": client_secret,
    "response_type": "code",
    "access_type": "offline",
    "client_certificate_hash": client_hash,
}

params = urlencode(sorted(params_url.items()))
url = f"{SERVICE_URL}?{params}"
print("URL:", url)
python
  • 1 1 个回答
  • 57 Views

1 个回答

  • Voted
  1. Best Answer
    supreme1444 вас
    2025-03-31T14:23:28Z2025-03-31T14:23:28Z

    简而言之,它可能对某些人有用。我正在以工作代码的形式提出这个问题的解决方案。简而言之,存在几个问题。谁会做只需获取代码,写下你的'client_certificate_hash':'Hash','client_id':client_idn,redirect_uri =“重定向”和容器名称cont = f“容器名称”。一切都应该顺利进行以获取代码。主要还是看f'/opt/cprocsp/bin/amd64/csptest本身所在的路径

    import base64
    import os
    import tempfile
    import uuid
    from datetime import datetime,timezone,timedelta
    
    from urllib import request
    from urllib.parse import urlencode
    from venv import logger
    from flask import jsonify, request
    import jwt
    from util.redis import save_state_and_client_id_to_redis
    
    API_KEY = "____"
    
    def get_timestamp_v2():
        tz = timezone(timedelta(hours=3))
        now = datetime.now(tz)
        timestamp = now.strftime("%Y.%m.%d %H:%M:%S %z")
        return timestamp
    z
    
    async def sign_params_for_v2_by_csptest(client_secret_raw):
        cont = f"Имя контейнера"
        tmp_dir = tempfile.gettempdir()
        source_file = tempfile.NamedTemporaryFile(mode='w', delete=False, dir=tmp_dir)
        source_file.write(client_secret_raw)
        source_file.close()
        source_path = source_file.name
        destination_path = source_path + ".sig"
        cmd = (f'/opt/cprocsp/bin/amd64/csptest -keys -cont {cont} -sign GOST12_256 -in {source_path} -out {destination_path} -keytype exchange')
        os.system(cmd)
        signed_message = open(destination_path, 'rb').read()
        os.unlink(source_path)
        os.unlink(destination_path)
        return base64.urlsafe_b64encode(signed_message[::-1]).decode('utf-8')
    
    async def get_data_sig_v2():
        auth_header = request.headers.get('Authorization')
        if not auth_header:
            return jsonify({'error': 'Authorization header is missing'}), 401
        token = auth_header.split(" ")[1] if " " in auth_header else auth_header
    
        try:
            decoded_token = jwt.decode(token, API_KEY, algorithms=["HS256"])
            client_id = decoded_token.get('client_id')
    
        except jwt.InvalidTokenError:
            return jsonify({'error': 'Invalid token'}), 401
        client_type = request.args.get('client_type')
        sign_data = request.args.get('sign_data')
        if client_type not in ['ul', 'fl'] or sign_data not in ['data_str', 'data_file']:
            return jsonify({'error': 'Missing required parameters'}), 400
        if client_type == "fl" and sign_data == 'data_str':
            scope = "openid fullname"
        elif client_type == "ul"  and sign_data == 'data_str':
            scope = "fullname birthdate  inn id_doc birthplace email mobile addresses org_inf"
        else:
            raise ValueError(f"Unknow client_type: {client_type}. expected 'fl' или 'ul'.")
        state = str(uuid.uuid4())
        params_to_redis={state:client_id}
        redirect_uri = "Редирект"
        time = get_timestamp_v2()
        client_idn = "Клиент ID"
        plaintext = (client_idn + scope + time + state + redirect_uri)
        client_secret = await sign_params_for_v2_by_csptest(plaintext)
        await save_state_and_client_id_to_redis(params_to_redis)
        try:
            params = {
                'client_id': client_idn,
                'scope': scope,
                'timestamp': time,
                'state': state,
                'redirect_uri':redirect_uri,
                'client_secret':client_secret,
                'response_type': 'code',
                'access_type': 'offline',
                'client_certificate_hash':'Hash'
            }
            params_encoded = urlencode(params)
            auth_url = f'https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac?{params_encoded}'
            logger.error(f"URL: {auth_url}")
            return jsonify({'auth_url': auth_url}), 200
        except Exception as e:
            logger.error(f"error generation auth URL: {str(e)}")
            return jsonify({'error': 'Error generation'}), 500
    
    
    # https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac?client_id=AITI&redirect_uri=https://vmg.it-service.club/api/get_autorization_esia&scope=openid fullname birthdate&response_type=code&state=9a0656bd-17bb-45c2-a749-b289395bb1ba&timestamp=2025.03.2716:52:25+0300&access_type=offline&client_certificate_hash=deb88fb3c8112f71125e88879e42cea4d0dea7f6&
    
    
    
    
    
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5