当前位置: 首页 > news >正文

PHP实现 Apple ID 登录的服务端验证指南

在 iOS 应用中启用 “通过 Apple 登录”(Sign In with Apple)后,客户端会获取一个 身份令牌(identity token)。该令牌是一个JWT(JSON Web Token),需要由服务端验证其真实性和完整性,然后才能用于在您的系统中创建或登录用户账户。下面我们详细说明 Apple 登录的完整服务端流程,以及如何在PHP中验证 Apple 返回的JWT,包括获取并缓存公钥、验证签名和重要的安全细节。

Apple 登录的服务端流程概览

  1. 客户端获取身份令牌:用户在 iOS 上通过Apple完成登录后,您的应用会收到一个 identityToken(以及一个 authorizationCode)。identityToken 实质上是一个JWT字符串,由三部分组成:header(头部)、payload(载荷)和signature(签名),以.分隔​。该JWT由Apple使用其私钥签名,包含了用户标识等信息。

  2. 传输给服务端:客户端将此 identityToken 发送给您的应用服务器。服务端需要验证该令牌确实由 Apple 签发且未被篡改。Apple没有提供类似Google那样的直接API来验证这个token,因此需要服务端自行完成JWT的验证。

  3. 服务端验证JWT签名:服务端从Apple提供的公开密钥中找到对应的公钥,验证JWT的签名是否有效​。只有使用Apple的公钥成功验证签名,才能确认该令牌确实由Apple签发​。

  4. 解码并校验载荷:签名验证通过后,解码JWT获取其中的payload数据,如用户的唯一标识(sub)、邮箱(email)等,并进一步校验关键字段的有效性(issuer、audience、过期时间、nonce等)​。

  5. 完成登录/注册:验证无误后,可使用JWT中的sub作为用户的Apple身份ID,在您数据库中查找或创建对应用户,并利用邮箱等信息完善用户数据。此后,即可认为该用户通过Apple登录得到认证。

提示:Apple还提供了使用authorizationCode换取令牌的OAuth接口,但本文主要聚焦于直接验证identityToken(JWT)的方案。

获取并缓存 Apple 公钥 (JWKS)

Apple 使用其私钥对 identityToken 进行签名,因此服务端需要通过 JWKS(JSON Web Key Set)接口获取 Apple 的公钥集合,并从中提取对应的公钥用于签名验证。JWKS 接口地址为:

https://appleid.apple.com/auth/keys

返回的数据结构类似于以下 JSON 格式:

{"keys": [{"kty": "RSA","kid": "ABCD1234EFGH","use": "sig","n": "...","e": "..."},...]
}

每个密钥包含kid(密钥标识)、alg(算法)、n(模数)、e(指数)等信息。我们需要根据JWT中header部分的kid来选择正确的公钥进行验证​。切勿将公钥信息硬编码在服务端,因为Apple可能不定期更换公钥或增加新的密钥​。应该每隔一段时间通过上述接口获取最新JWKS,并缓存这些公钥,以减少每次验证时的网络请求和延迟​,每条记录中的 kid 字段对应于签发 token 时使用的密钥 ID。需根据该字段匹配正确的公钥。

解析并验证 identityToken

客户端传递过来的 identityToken 是一个标准的 JWT 结构,由三部分组成:头部、载荷和签名。以下是具体步骤:

  1. 解码 JWT 并提取头部信息
    提取 kid 值以定位 JWKS 中的具体公钥。

  2. 加载 Apple 公钥
    将 JWKS 返回的公钥转换为适合验证的形式。

  3. 验证签名有效性
    利用 firebase/php-jwt 库调用方法验证签名是否合法。没有安装请安装
    composer require firebase/php-jwt

示例代码如下:

<?php
require_once __DIR__ . '/vendor/autoload.php';use Firebase\JWT\JWK;
use Firebase\JWT\JWT;// (1) 从客户端获取 Apple 身份令牌 (JWT 字符串)
$identityToken = $_POST['identityToken'] ?? '';  // 这里假设通过POST传入// (2) 获取Apple的JWKS公钥列表(可加缓存机制避免频繁请求)
$jwksJson = file_get_contents('https://appleid.apple.com/auth/keys');
$jwkSet = json_decode($jwksJson, true);
if (!$jwkSet || !isset($jwkSet['keys'])) {exit("无法获取Apple公钥 JWKS");
}// 将JWKS转换为公钥数组(使用kid索引)
$publicKeys = JWK::parseKeySet($jwkSet);  // 解析成功将返回以kid为键的公钥数组&#8203;:contentReference[oaicite:11]{index=11}try {// (3) 验证JWT签名并解码payload(指定只允许RS256算法)$payload = JWT::decode($identityToken, $publicKeys, ['RS256']);
} catch (\Exception $e) {// 签名验证或解码失败exit("令牌无效:" . $e->getMessage());
}// (4) JWT 验证通过,提取payload中的数据
$payloadData = (array)$payload;  // 转换StdClass为关联数组
// 例如:$payloadData 包含 iss, aud, exp, iat, sub, email 等字段// (5) 校验重要字段
if ($payloadData['iss'] !== 'https://appleid.apple.com') {exit("令牌签发者无效");
}
$clientId = '你的App的CLIENT_ID或Bundle ID';  // 开发者在Apple注册的服务ID
if ($payloadData['aud'] !== $clientId) {exit("令牌的受众不匹配");
}
if ($payloadData['exp'] < time()) {exit("令牌已过期");
}
if (isset($payloadData['nonce'])) {// 如果您的登录请求使用了nonce,则在此处验证 nonce 是否匹配$expectedNonce = '当初发送登录请求时的原始nonce或其哈希';if ($payloadData['nonce'] !== $expectedNonce) {exit("Nonce 验证失败");}
}// (6) 利用验证后的用户信息执行后续逻辑
$userId = $payloadData['sub'];        // Apple用户唯一ID
$userEmail = $payloadData['email'] ?? '';  // 用户的Email(可能是私隐中继邮件地址)

 构造 client_secret

在请求 Apple OAuth 认证的过程中,还需要提供一个名为 client_secret 的参数。这是一个自定义生成的 JWT,包含以下内容:

  • iss: 开发者团队 ID (TeamID)。
  • aud: 固定值 "https://appleid.apple.com"
  • sub: App Bundle Identifier。
  • iat: 当前时间戳。
  • exp: 过期时间戳(通常设置为 iat + 1800 秒)。

生成流程如下:

<?php
use Firebase\JWT\JWT;$teamId = 'YOUR_TEAM_ID';         // 替换为实际 Team ID
$clientSecretKeyId = 'KEY_ID';   // 替换为实际 Key ID
$bundleIdentifier = 'BUNDLE_ID'; // 替换为应用的 Bundle Identifier
$pemFilePath = './AuthKey.pem';   // 下载的私钥路径$header = ['alg' => 'ES256','kid' => $clientSecretKeyId,
];$payload = ['iss' => $teamId,'aud' => 'https://appleid.apple.com','sub' => $bundleIdentifier,'iat' => time(),'exp' => time() + 1800, // 设置有效期为半小时
];$keyContent = openssl_pkey_get_private(file_get_contents($pemFilePath));if (!$keyContent) {die("Failed to load private key");
}$clientSecret = JWT::encode($payload, $keyContent, 'ES256', null, $header);echo "Generated client_secret: {$clientSecret}";
?>

利用 ES256 算法生成了一个有效的 client_secret,供后续认证请求使用

请求访问令牌

向 Apple 发起 POST 请求以交换最终的访问令牌。URL 地址为:

https://appleid.apple.com/auth/token

所需参数包括但不限于:

  • grant_type: 固定值 "authorization_code".
  • code: 手机端传来的 authorizationCode.
  • redirect_uri: 注册的应用回调 URL.
  • client_id: App 的 Bundle Identifier.
  • client_secret: 上述生成的结果.

代码片段如下:

$data = http_build_query(['grant_type' => 'authorization_code','code' => $_POST['authorizationCode'],'redirect_uri' => 'REDIRECT_URI',     // 替换为实际重定向 URI'client_id' => 'BUNDLE_IDENTIFIER',   // 替换为实际 Bundle Identifier'client_secret' => $clientSecret,    // 上面生成的 client_secret
]);$options = ['http' => ['method' => 'POST','content' => $data,'header' => 'Content-Type: application/x-www-form-urlencoded'],
];$response = file_get_contents('https://appleid.apple.com/auth/token', false, stream_context_create($options));
var_dump(json_decode($response, true)); // 输出响应数据

相关文章:

PHP实现 Apple ID 登录的服务端验证指南

在 iOS 应用中启用 “通过 Apple 登录”&#xff08;Sign In with Apple&#xff09;后&#xff0c;客户端会获取一个 身份令牌&#xff08;identity token&#xff09;。该令牌是一个JWT&#xff08;JSON Web Token&#xff09;&#xff0c;需要由服务端验证其真实性和完整性&…...

一、linux系统启动过程操作记录

一、linux系统启动过程 经历&#xff1a; 上电–>uboot–>加载内核–>挂载根文件系统–>执行应用程序 uboot等效bootloader&#xff0c;启动过程进行了 跳转到固定的位置执行相应的代码 初始化硬件设备&#xff0c;如&#xff1a;cpu初始化 &#xff0c;看门狗&a…...

【首款Armv9开源芯片“星睿“O6测评】SVE2指令集介绍与测试

SVE2指令集介绍与测试 一、什么是SVE2 在Neon架构扩展&#xff08;其指令集向量长度固定为128位&#xff09;的基础上&#xff0c;Arm设计了可伸缩向量扩展&#xff08;Scalable vector extension&#xff0c; SVE&#xff09;。SVE是一种新的单指令多数据&#xff08;SIMD&am…...

获取电脑mac地址

Windows 系统 方法1:通过命令提示符 1. 按下 `Win + R`,输入 `cmd` 后按回车,打开命令提示符。 2. 输入以下命令并按回车:...

AI核心技术与应用场景的深度解析

AI核心技术与应用场景的深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于AI核心技术与应用场景的问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对AI…...

练习普通话,声音细柔和

《繁星》 我爱月夜&#xff0c;但我也爱星天。从前在家乡七八月 的夜晚&#xff0c;在庭院里纳凉的时候&#xff0c;我最爱看天上密密 麻麻的繁星。望着星天&#xff0c;我就会忘记一切&#xff0c;仿佛回 到了母亲的怀里似的。 三年前在南京我住的地方&#xff0c;有…...

Linux进程详细解析

1.操作系统 概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; • 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; • 其他程序&#xff08…...

Linux执行脚本报错

执行脚本报错&#xff1a;./startup.sh -bash: ./startup.sh: /bin/bash^M: bad interpreter: No such file or directory ./startup.sh -bash: ./startup.sh: /bin/bash^M: bad interpreter: No such file or directory可能的原因&#xff1a; 文件开头格式问题&#xff1a…...

C++学习:六个月从基础到就业——模板编程:类模板

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;类模板 本文是我C学习之旅系列的第三十三篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十一篇&#xff0c;主要介绍C中的类模板编程。查看完整系列目录了解更多内容。 目录 引言类模板的基本语法…...

Conda 虚拟环境复用

文章目录 一、导出环境配置二、克隆环境配置三、区别小结 一、导出环境配置 导出&#xff1a;将当前虚拟环境导出成一个yml配置文件。conda activate your_env conda env export > your_env.yml导入&#xff1a;基于yml文件创建新环境&#xff0c;会自动按照yml里的配置&am…...

Nacos简介—4.Nacos架构和原理三

大纲 1.Nacos的定位和优势 2.Nacos的整体架构 3.Nacos的配置模型 4.Nacos内核设计之一致性协议 5.Nacos内核设计之自研Distro协议 6.Nacos内核设计之通信通道 7.Nacos内核设计之寻址机制 8.服务注册发现模块的注册中心的设计原理 9.服务注册发现模块的注册中心的服务数…...

4月27日日记

现在想来&#xff0c;可以想到什么就记录下来&#xff0c;这也是网上写日记的一个好处&#xff0c;然后 今天英语课上看到一个有关迷信的视频&#xff0c;就是老师课件里的&#xff0c;感觉画风很不错&#xff0c;但是我贫瘠的语言形容不出来&#xff0c;就想到是不是世界上的…...

CentOS7.9安装OpenSSL 1.1.1t和OpenSSH9.9p1

一、临时开启telnet登录方式&#xff0c;避免升级失败无法登录系统 &#xff08;注意telnet登录方式存在安全隐患&#xff0c;升级openssh相关服务后要记得关闭&#xff09; 1.安装telnet服务 yum -y install xinetd telnet* 2.允许root用户通过telnet登陆&#xff0c;编辑…...

单例模式:全局唯一性在软件设计中的艺术实践

引言 在软件架构设计中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;以其独特的实例控制能力&#xff0c;成为解决资源复用与全局访问矛盾的经典方案。该模式通过私有化构造方法、静态实例存储与全局访问接口三大核心机制&#xff0c;确保系统中特定类仅存在…...

Spring 与 ActiveMQ 的深度集成实践(三)

五、实战案例分析 5.1 案例背景与需求 假设我们正在开发一个电商系统&#xff0c;其中订单模块和库存模块是两个独立的子系统 。当用户下单后&#xff0c;订单模块需要通知库存模块进行库存扣减操作 。在传统的同步调用方式下&#xff0c;订单模块需要等待库存模块完成扣减操…...

30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天

1 题目地址 459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09;459. 重复的子字符串 - 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1:输入: s "abab"输出: true解释: 可由子串 "ab" 重复两次构成…...

rocketmq一些异常记录

rocketmq一些异常记录 Product 设置不重复发送 发送 一次失败&#xff0c;不会在被发送到mq消息队列中&#xff0c;相当于消息丢失。 2、 Consumer 消费失败 重试三次消费 都失败 则消息消费失败&#xff0c;失败后 会放入 死信队列&#xff0c;可以手动处理在mq面板 处理死信队…...

SQLMesh 测试自动化:提升数据工程效率

在现代数据工程中&#xff0c;确保数据模型的准确性和可靠性至关重要。SQLMesh 提供了一套强大的测试工具&#xff0c;用于验证数据模型的输出是否符合预期。本文将深入探讨 SQLMesh 的测试功能&#xff0c;包括如何创建测试、支持的数据格式以及如何运行和调试测试。 SQLMesh …...

WPF使用SQLite与JSON文本文件结合存储体侧平衡数据的设计与实现

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

关系型数据库PostgreSQL vs MySQL 深度对比:专业术语+白话解析+实战案例

PostgreSQL 与 MySQL 的详细对比 PostgreSQL 和 MySQL 是两种最流行的开源关系型数据库&#xff0c;它们在设计理念、功能特性和适用场景上有显著差异。以下是它们的详细对比&#xff1a; 一、基本架构与设计理念 PostgreSQL&#xff1a;多进程架构&#xff0c;使用共享内存通…...

利用 SSRF 和 Redis 渗透

环境搭建 在本次实验中&#xff0c;我们使用 Docker 环境进行测试。 解压实验包&#xff0c;搭建 docker 环境。 docker环境 web的dockerfile 主要利用代码 &#xff1a; redis服务器 通过 docker-compose up -d 启动相关容器&#xff0c;初次启动失败。 发现 docker 版本问…...

脏读、幻读、可重复读

脏读 定义&#xff1a;一个事务读取了另一个事务尚未提交的数据 。比如事务 A 修改了某条数据但还没提交&#xff0c;此时事务 B 读取了这条被修改但未提交的数据。若事务 A 后续回滚&#xff0c;事务 B 读到的数据就是无效的&#xff0c;相当于读到了 “脏数据”。危害&#…...

第1讲、#PyTorch教学环境搭建与Tensor基础操作详解

引言 PyTorch是当前深度学习领域最流行的框架之一&#xff0c;因其动态计算图和直观的API而备受开发者青睐。本文将从零开始介绍PyTorch的环境搭建与基础操作&#xff0c;适合各种平台的用户和深度学习初学者。 1. 安装和环境搭建 macOS (Apple Silicon) 对于Mac M1/M2/M3用…...

【创新实训个人博客】数据库搭建

1.原因 为了降低模型使用以前训练的数据或者幻觉知识&#xff0c;我们在对话时需要提供相关内容的数据&#xff0c;同时由于需要最新的广告实时数据&#xff0c;实时爬取和版权问题。数据由团队在网上爬取&#xff0c;为了广告内容的有效性&#xff0c;如果长期使用&#xff0…...

《代码整洁之道》第6章 对象和数据结构 - 笔记

数据抽象 (Data Abstraction) 这个小节主要讲的是**面向对象编程&#xff08;OOP&#xff09;**的一种核心思想&#xff1a;对象应该隐藏它的内部数据&#xff0c;只暴露可以操作这些数据的“行为”&#xff08;也就是方法/函数&#xff09;。 大白话&#xff1a; 你创建一个…...

Python判断字符串中是否包含特殊字符

在 Python 中&#xff0c;判断一个字符串是否包含特殊字符可以通过多种方法实现。常见的特殊字符包括空格、感叹号、单引号、括号、星号、加号、逗号、斜杠、冒号、分号、等号、问号、 符号、方括号、花括号和 & 符号等。 为了判断字符串中是否包含这些特殊字符&#xff0…...

disruptor-spring-boot-start版本优化升级

文章目录 1.前言2.升级内容3.依赖4.总结 1.前言 由于之前写了一篇《disruptor-spring-boot-start生产实践导致pod节点CPU爆表100%的问题解决说明》的文章&#xff0c;里面说本地启动没有啥问题&#xff0c;后面我启动之前写的那个测试的controller发现&#xff0c;本地电脑的CP…...

复杂背景下无人机影像小目标检测:MPE-YOLO抗遮挡与抗背景干扰设计

目录 一、引言 二、挑战和贡献 密集小目标和遮挡 实时性要求与精度权衡 复杂背景 三、MPE-YOLO模型细节 多级特征集成器&#xff08;MFI&#xff09; 感知增强卷积&#xff08;PEC&#xff09; 增强范围C2f模块&#xff08;ES-C2f&#xff09; 四、Coovally AI模型训…...

项目实战 -- 状态管理

redux基础 还记得好久好久之前就想要实现的一个功能吗&#xff1f; 收起侧边栏折叠菜单&#xff0c;没错&#xff0c;现在才实现 因为不是父子通信&#xff0c;所以处理起来相对麻烦一点 可以使用状态树或者中间人模式 这就需要会redux了 Redux工作流&#xff1a; 异步就…...

基于单片机的智能药盒系统

标题:基于单片机的智能药盒系统 内容:1.摘要 本文聚焦于基于单片机的智能药盒系统。背景方面&#xff0c;随着人口老龄化加剧&#xff0c;老年人按时准确服药问题愈发凸显&#xff0c;同时现代快节奏生活也使人们容易遗忘服药时间。目的是设计并实现一个能帮助人们按时、按量服…...

【PyCharm- Python- ArcGIS】:安装一个和 ArcGIS 不冲突的独立 Python让PyCharm 使用 (解决全过程记录)

之前电脑上安装了anaconda3&#xff0c;python3和arcgis10.2.其中anaconda3带有python3&#xff0c;arcgis10.2自带python2.7。arcgis不能正常使用&#xff0c;之前为了使用arcgis&#xff0c;因此卸载了anaconda3和python3&#xff0c;PyCharm不能正常使用了 之前安装的卸载后…...

【C语言干货】回调函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、回调函数 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、回调函数 在 C 语言中&#xff0c;当你有一个函数并希望将其作…...

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升&#xff0c;我们需要对这些用户数据进行挖掘&#xff0c;传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…...

现场问题排查-postgresql某表索引损坏导致指定数据无法更新影响卷宗材料上传

问题现象 今天突然被拉进一个群&#xff0c;说某地区友商推送编目结果报错&#xff0c;在我们自己的卷宗系统上传材料也一直转圈&#xff0c;也删除不了案件卷宗&#xff0c;重置模板也没用&#xff0c;只有个别案件有问题。虽然这事儿不属于我负责&#xff0c;但还是抽时间给…...

数字化转型的未来趋势:从工具到生态,聚焦生态合作、绿色转型与全球化布局

摘要 本文将深入探讨了数字化转型的演进路径&#xff0c;特别是从依赖单一数字化工具向构建和参与复杂商业生态系统的战略转变。分析表明&#xff0c;这一转变不仅是技术升级&#xff0c;更是商业模式、运营逻辑和价值创造方式的根本性变革。云计算、人工智能和大数据分析等 f…...

记录学习记录学习《手动学习深度学习》这本书的笔记(九)

马不停蹄地来到了第十二章&#xff1a;计算性能…… 感觉应该是讲并行计算方面的&#xff0c;比如GPU、CPU、CUDA那些。 第十二章&#xff1a;计算性能 12.1 编译器和解释器 这里先提出了命令式编程和符号式编程的概念。 命令式编程VS符号式编程 目前为止&#xff0c;本书…...

麒麟系统通过 Service 启动 JAR 包的完整指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

【记录maven依赖规则-dependencyManagement,dependencies】

记录maven依赖规则-dependencyManagement&#xff0c;dependencies 依赖方式 直接依赖 间接依赖 依赖关系 直接依赖&#xff1a; 父级管理定义的版本&#xff0c;并且在中进行引用了的版本。 优先使用dependencyManagement定义的版本。 间接依赖&#xff1a; 如果间接依赖…...

macos下mysql 5.7/8.0版本切换

1、首先安装好mysql 5.7/8.0&#xff0c;可以用brew进行安装 5.7 的原始配置文件路径&#xff1a; /usr/local/Cellar/mysql5.7/5.7.44_1/homebrew.mxcl.mysql5.7.plist 配置内容如下&#xff1a; 对应的.cnf配置文件内容如下&#xff1a; 8.0 的原始配置文件路径&#xff1…...

FPGA时钟设计

实现功能&#xff1a;基于Verilog的动态显示时钟设计&#xff0c;支持整点&#xff08;时:00:00&#xff09;闪烁功能。代码包含时钟计数、动态扫描、整点检测和闪烁控制模块&#xff1a; module dynamic_clock(input clk, // 主时钟&#xff08;假设50MHz&#xff0…...

【NVM】管理不同版本的node.js

目录 一、下载nvm 二、安装nvm 三、验证安装 四、配置下载镜像 五、使用NVM 前言&#xff1a;不同的node.js版本会让你在使用过程很费劲&#xff0c;nvm是一个node版本管理工具&#xff0c;通过它可以安装多种node版本并且可以快速、简单的切换node版本。 一、下载nvm htt…...

【今日三题】笨小猴(模拟) / 主持人调度(排序) / 分割等和子集(01背包)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 笨小猴(模拟)主持人调度(排序)分割等和子集(01背包) 笨小猴(模拟) 笨小猴 #include <iostream> #include <string…...

android10 卸载应用出现回退栈异常问题

打开设置&#xff0c;打开APP1&#xff0c;使用adb uninstall 卸载APP1/或者杀掉APP1进程&#xff0c;没有回到设置而是回到了桌面 抓取eventlog&#xff0c;查看ams/wms打印&#xff0c;发现“am_focused_stack: appDied leftTaskHistoryEmpty”源码中搜索“leftTaskHistoryE…...

位置差在坐标系间的相互转换

1 NED转经纬高 &#xff08;n 系下的北向、东向和垂向位置差异&#xff08;单位 m&#xff09;转化为纬度、经度和高程分量的差异&#xff09; 2 基站坐标转换 纬度、经度、高程 到 ECEF %纬度、经度、高程 到 ECEF clc; clear; glvs; addpath(genpath(E:\GNSSINS\ACES)…...

在线重定义——分区表改造

在数据库管理过程中&#xff0c;随着数据量的不断增长&#xff0c;普通表的查询、维护成本不断上升。为了提升查询性能和管理效率&#xff0c;通常需要将大表进行分区处理。 本文介绍如何使用 Oracle 在线重定义&#xff08;DBMS_REDEFINITION&#xff09; 的方式对现有大表进行…...

day51—二分法—x 的平方根(LeetCode-69)

题目描述 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 …...

网络安全漏洞现状与风险管理分析

在当今数字化时代&#xff0c;网络安全已成为企业和组织不可忽视的核心问题。网络环境的日益复杂和攻击手段的不断升级&#xff0c;使得漏洞管理成为网络安全战略中的关键环节。下面将详细分析当前网络安全领域的漏洞现状及有效的风险管理策略。 当前网络安全面临的挑战 高危漏…...

二、Web服务常用的I/O操作

一、单个或者批量上传文件 前端&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件…...

Pinia——Vue的Store状态管理库

一、Store 是什么&#xff1f; Store (如 Pinia) 是一个保存状态和业务逻辑的实体&#xff0c;它并不与你的组件树绑定。换句话说&#xff0c;它承载着全局状态。它有点像一个永远存在的组件&#xff0c;每个组件都可以读取和写入它。它有三个概念&#xff0c;state、getter 和…...

生成式人工智能认证(GAI认证)适合那些人考?

在人工智能浪潮席卷全球的今天,你是否曾思考过:当机器开始创作诗歌、设计建筑、撰写代码,甚至模拟人类思维时,我们该如何与这个“新物种”共处?更关键的是,当生成式人工智能(Generative AI)从实验室走向千行百业,谁将成为驾驭这场技术革命的“领航者”?答案或许藏在一…...