区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载login_plugin是 EOSeosnodeos 的一个可选插件用于支撑应用程序与区块链进行认证这一场景它通过一组 HTTP API让应用可以验证某个账户是否被允许登录即其持有的密钥集合是否满足区块链上指定permission的授权要求。读完本文你将掌握该插件的启用方式、两个核心配置项--max-login-requests与--max-login-timeout的语义以及其背后基于临时密钥对ephemeral key、ECDH 共享秘密、sha256摘要与授权管理器校验的完整工作流程。插件概述与适用场景login_plugin的核心职责是支持应用程序使用 EOSIO 区块链进行认证。具体而言它提供的 API 允许一个应用程序验证某个账户是否被允许登录——即验证该账户是否能够提供一组签名以满足区块链上某个指定的permission权限级别的授权要求。在 nodeos 的插件体系中插件总览 将插件划分为核心必需与可选增强两类login_plugin属于可选插件为 DApp 或钱包类应用提供认证能力但对节点的基础运行并非必需。它不直接参与出块、同步或交易执行而是借助http_plugin暴露 REST 风格接口并借助chain_plugin查询链上的权限与密钥信息。从源码结构看该插件由三个文件组成插件声明与数据结构定义了插件类、请求/响应参数结构体及FC_REFLECT反射宏插件实现包含配置解析、HTTP 路由注册与两个核心登录流程构建配置声明库目标并链接chain_plugin、http_plugin与appbase。启用方式login_plugin是编译期插件与运行时插件相对它随 nodeos 一起构建通过 plugins/CMakeLists.txt 中的add_subdirectory(login_plugin)纳入构建并在 nodeos 主程序 中通过-Wl,${whole_archive_flag} login_plugin静态链接进 nodeos。因此只需在启动参数或配置文件中声明启用无需额外安装。方式一config.ini在config.ini中追加插件声明及可选项# config.ini plugin eosio::login_plugin [options]方式二命令行# command-line nodeos ... --plugin eosio::login_plugin [options]两种方式等价[options]即下文所述的配置项可在任一处指定。配置选项以下选项既可从 nodeos 命令行指定也可写入config.iniConfig Options for eosio::login_plugin: --max-login-requests arg (1000000) The maximum number of pending login requests --max-login-timeout arg (60) The maximum timeout for pending login requests (in seconds)配置项默认值类型含义--max-login-requests1000000uint32_t允许挂起的登录请求的最大数量--max-login-timeout60uint32_t挂起登录请求的最大超时时间秒源码中的解析与生效逻辑从 login_plugin.cpp 可以看到这两个选项的实际作用选项在set_program_options中注册默认值分别为1000000与60与文档一致在plugin_initialize中读取并存入内部实现对象login_plugin_implmax_login_requests用于约束挂起请求总量start_login_request中通过断言my-requests.size() my-max_login_requests限制并发登录请求数超出时抛出 Too many pending login requestsmax_login_timeout用于截断请求有效期请求的实际过期时间取min(请求方指定的 expiration_time, 当前时间 max_login_timeout)防止单次请求无限制挂起。login_plugin_impl内部使用boost::multi_index_container维护挂起请求同时提供按server_ephemeral_pub_key的唯一索引与按过期时间的非唯一索引并在每次请求到来时通过expire_requests()惰性清理已过期的条目。依赖项login_plugin依赖另外两个插件二者缺一不可chain_pluginhttp_plugin源码层面login_plugin.hpp 中的APPBASE_PLUGIN_REQUIRES((chain_plugin)(http_plugin))显式声明了依赖关系CMakeLists.txt 中的target_link_libraries( login_plugin chain_plugin http_plugin appbase )与之一致。同时finalize_login_request会通过app().get_pluginchain_plugin().chain()获取链控制器再经由get_authorization_manager()执行权限校验而 HTTP 路由则注册在http_plugin之上。依赖启用示例# config.ini plugin eosio::chain_plugin [options] plugin eosio::http_plugin [options]# command-line nodeos ... --plugin eosio::chain_plugin [options] \ --plugin eosio::http_plugin [options]提供的 HTTP API 与登录流程login_plugin在plugin_startup中向http_plugin注册了以下两个可用端点/v1/login/前缀HTTP 200/v1/login/start_login_request发起登录请求/v1/login/finalize_login_request完成登录请求并校验权限。值得一提的是源码中还有三个以do_not_use_为前缀的端点声明——do_not_use_gen_r1_key、do_not_use_sign、do_not_use_get_secret分别用于生成 R1 密钥对、对数据签名、计算共享秘密它们在当前版本中已被注释掉、未对外注册仅保留结构体与实现可推断其定位是不希望应用直接使用的不安全辅助接口。另外所有端点的请求体为空时会被视为{}异常统一交由http_plugin::handle_exception处理。1. start_login_request发起登录请求参数start_login_request_params字段类型说明expiration_timechain::time_point_sec请求方期望的过期时间处理逻辑见 login_plugin.cpp先清理已过期的旧请求断言请求方指定的过期时间必须晚于当前时间否则抛timeout_exception断言挂起请求数未达max_login_requests上限生成一次性 R1 临时私钥/公钥对private_key_type::generate_r1()服务端保留私钥将实际过期时间截断为min(请求方 expiration_time, now max_login_timeout)将请求存入容器并返回服务端临时公钥。响应结果start_login_request_results字段类型说明server_ephemeral_pub_keychain::public_key_type服务端临时公钥客户端后续步骤需要使用2. finalize_login_request完成登录与权限校验请求参数finalize_login_request_params字段类型说明server_ephemeral_pub_keychain::public_key_type上一步拿到的服务端临时公钥client_ephemeral_pub_keychain::public_key_type客户端临时公钥permissionchain::permission_level需要满足的链上权限账户 权限名如aliceactivedatastd::string应用自定义数据signaturesstd::vectorchain::signature_type客户端对摘要的签名列表处理逻辑见 login_plugin.cpp清理过期请求后按server_ephemeral_pub_key查找挂起请求若不存在已过期或从未发起返回错误server_ephemeral_pub_key expired or not found并移除该请求一次性使用使用服务端临时私钥与客户端临时公钥计算 ECDH 共享秘密generate_shared_secret依次以fc::raw打包permission、shared_secret、data对拼接结果计算sha256得到digest对每个签名调用chain::public_key_type{sig, digest}恢复出签名公钥得到recovered_keys集合通过chain.get_authorization_manager().check_authorization(actor, permission, recovered_keys, {}, fc::microseconds(0), noop_checktime, true)校验这些公钥是否满足指定permission的授权校验通过则permission_satisfied true否则置错误信息keys do not satisfy permission。响应结果finalize_login_request_results字段类型说明digestchain::sha256实际参与校验的摘要客户端应以此为准对data等材料签名recovered_keysflat_setchain::public_key_type从签名中恢复出的公钥集合permission_satisfiedbool恢复出的密钥是否满足指定权限errorstd::string出错时的错误信息如请求不存在、密钥不满足权限一个完整的认证交互示意结合上述两个端点一个典型登录流程可以描述为客户端调用start_login_request携带期望的expiration_time获得服务端临时公钥server_ephemeral_pub_key客户端生成自己的临时密钥对取client_ephemeral_pub_key客户端使用server_ephemeral_pub_key与自己的临时私钥计算同一份共享秘密并将(permission, shared_secret, data)打包求sha256得到摘要用账户权限对应的私钥对摘要签名客户端调用finalize_login_request提交server_ephemeral_pub_key、client_ephemeral_pub_key、permission、data与signatures服务端重算共享秘密与摘要从签名恢复公钥并调用链上授权管理器判定这些公钥是否满足该permission返回permission_satisfied供应用决策。由于共享秘密参与摘要计算该流程天然绑定了发起请求的双方可防止重放与中间人替换请求材料服务端临时私钥在请求完成后即被丢弃保证一次性语义。构建与使用注意事项该插件随 nodeos 默认构建启用只需在命令行或config.ini中声明plugin eosio::login_plugin并确保同时启用chain_plugin与http_pluginhttp_plugin还需配合http-server-address等网络配置方可对外提供服务详见 http_plugin 文档当前对外暴露的端点仅start_login_request与finalize_login_requestdo_not_use_*系列接口处于禁用状态不应依赖它们配置项均为非负整数修改后需重启 nodeos 生效本插件是认证/授权验证类辅助功能不影响节点核心链数据流程生产环境中应结合网络安全策略TLS、访问控制使用。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐gin-vue-admin安全机制详解JWT认证与Casbin权限控制gin vue admin安全机制详解JWT认证与Casbin权限控制 在Web应用开发中安全机制是保护用户数据和系统资源的核心。gin vue admin后端前端认证鉴权低代码任务调度Ursa.Avalonia身份验证用户登录和权限Ursa.Avalonia身份验证用户登录和权限 概述 在现代企业级应用程序开发中身份验证Authentication和权限控制AuthorizatiUI组件桌面应用跨平台ChartDB身份验证用户登录与权限控制ChartDB身份验证用户登录与权限控制 概述 ChartDB作为一款开源的数据库图表编辑器其身份验证机制设计注重用户体验与数据安全。本文将深入解析Char数据库前端数据可视化AI 应用上一篇零代码部署ConvertX用K8s轻松管理多实例文件转换服务下一篇COLMAP十年技术演进从CVPR 2016到ECCV 2022的三维重建革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
