Play Games Services v1迁移v2以后,游戏APP加固应该重新验证哪些登录与账号链?
Play Games Services v1 迁移到 v2 后,游戏 APP 加固应该重新验证哪些登录与账号链?
如果 PGS v2 原始 Release 已经登录失败,就不应先把问题归因于 APP 加固。正确顺序是先固定旧稳定版本和服务端基线,再验证 PGS v2 原始包,随后逐级比较御盾基础保护、目标保护和最终签名 Play Release;同时把平台认证、游戏自己的账号、Player ID、Server Auth Code、存档与权益恢复分别记录。御盾负责候选包保护和发布兼容证据,不替代 Google 认证服务或游戏后端的身份裁决。
摘要
Google 官方弃用时间表说明,从 2026 年 9 月起 Google Sign-In for Android API 不再受支持,Play Games Services v1 也进入退出阶段;play-services-games:25.0.0 已移除 v1 API,仍依赖旧接口的项目在升级认证或相关第三方 SDK 后可能遇到编译和登录链故障。Play Games Services 弃用时间表
PGS v2 不是简单替换一个依赖。Play Games 平台认证与游戏自己的 In-Game Account(IGA)需要拆开:PGS Player ID 服务于 Play Games 平台能力,游戏的账号、进度、库存、货币和权益仍应由游戏自己的身份系统与后端管理。PGS v2 登录模型 如果旧项目把 Player ID 直接当成 IGA 主键,迁移时必须建立旧身份到新账号模型的关联;如果原本已经使用 OpenID 或独立账号体系,迁移路径通常不同。Android 迁移指南
本文不声称任何具体游戏已经完成迁移,也没有执行真实 Google 账号、服务器 Auth Code 交换、成就、排行榜或存档测试。所有候选包、账号迁移、签名与业务结果均为 NOT_TESTED。文章提供的是公开的 Game Authentication Release Gate 方法,实际发布仍需在客户受控环境完成。
读者对象
本文面向 Unity、Android、IL2CPP 游戏研发,发行与 QA 团队,以及负责登录、账号迁移、支付资产和 APP 加固验收的安全负责人。需要先了解 Unity 原生与 Native 交付门禁,可阅读Unity IL2CPP App 加固发布门禁;需要了解游戏数据可信度,可阅读Google Play Game Stats 数据可信度责任矩阵;客户端保护与服务端验收边界可参考御盾 APP 加固产品说明。
核心结论
- PGS v1 → v2 迁移属于认证链、平台身份和游戏账号模型的联合变更,不是只改 Gradle 依赖。
- 从 2026 年 9 月起 Google Sign-In for Android API 不再受支持,PGS v1 已进入明确退出路线;项目应按官方迁移文档检查依赖和插件版本。
- PGS Player ID 是 Play Games 平台身份,不应未经设计直接等同于游戏的唯一 IGA。
- 旧玩家迁移的关键不是弹窗是否出现,而是旧 Player ID、OpenID、IGA、进度、货币、库存和付费权益能否在服务端连续关联。
- PGS v2 的 Server Auth Code 应由客户端获取后交给游戏后端交换和验证,不能把长期 OAuth 秘密放进 APK。Android 服务端访问
- APP 加固验收要从 PGS v2 原始 Release 开始,再比较基础保护、目标保护和最终签名包;原始包已失败时,不应直接归因御盾。
- 自动静默认证、手动登录、老玩家、Guest、换设备、覆盖升级、成就、排行榜、存档和账号恢复都属于不同路径,不能用一次启动成功代表全部通过。
事实依据与脱敏证据
| 编号 | 官方或已发布来源 | 可确认事实 | 对游戏发布的意义 | 不能推出的结论 |
|---|---|---|---|---|
| 1 | PGS 弃用时间表 | Google Sign-In for Android 自 2026 年 9 月起不再受支持,PGS v1 进入退出路线 | 认证依赖应进入迁移台账 | 所有游戏会在同一天自动下线 |
| 2 | PGS 弃用时间表 | play-services-games:25.0.0 移除 v1 API |
升级依赖前要检查旧调用面 | 仅升级库就完成 v2 迁移 |
| 3 | PGS v2 登录模型 | 平台认证与游戏 In-Game Account 应区分 | 账号、进度和资产应由游戏后端管理 | Player ID 可以永远作为唯一游戏账号 |
| 4 | Android v2 迁移指南 | 旧项目需判断 Player ID 是否被用作 IGA 主身份 | 老玩家迁移要先盘点历史绑定 | 新旧身份可以不做关联直接上线 |
| 5 | Unity v2 迁移指南 | Unity 插件和认证流程需要按 v2 方案迁移 | Unity Plugin、Gradle 和原生依赖要一起回归 | IL2CPP 加固可以替代 SDK 迁移 |
| 6 | PGS 服务端访问 | 客户端可获取单次 Server Auth Code 交给后端交换 | 客户端与后端必须端到端验收 | 客户端本地保存长期服务端密钥是安全做法 |
| 7 | Unity Google Play Games 登录文档 | Unity 游戏登录仍需关注插件、平台和账号回调 | 业务路径要覆盖 Unity 与 Android 边界 | 所有 Unity 版本都自动兼容 v2 |
| 8 | 御盾 Unity IL2CPP 门禁页 | Unity/IL2CPP、Gradle、Native、ABI 和登录路径应联合验收 | 加固候选需要复测认证链 | APK 能启动就代表登录链通过 |
| 9 | 御盾 Game Stats 责任矩阵 | 游戏数据可信度需要区分客户端采集、服务端权威和平台数据 | 认证结果不能直接替代数据裁决 | PGS 返回值就是库存和货币真相 |
公开事实映射:PGS 变化与工程影响(Report Fact Mapping)
本节把本日公开政策变化转成发布工程问题,不把政策资料写成某个客户已经完成的测试结果。
| 公开变化 | 工程影响 | 建议动作 | 当前状态 |
|---|---|---|---|
| Google Sign-In for Android 自 2026 年 9 月起不再受支持 | 旧登录链存在生命周期风险 | 盘点 GSI、Credential Manager、PGS 旧调用 | NOT_TESTED |
| PGS v1 已进入退出阶段 | 旧 API 与插件不能作为长期基线 | 建立 v1、v2 依赖和插件版本表 | NOT_TESTED |
play-services-games:25.0.0 移除 v1 API |
盲目升级依赖可能导致编译或认证故障 | 先让 v2 原始包通过编译与登录 | NOT_TESTED |
| PGS Player ID 与 IGA 需要分开建模 | 老玩家可能出现身份断链 | 盘点旧 Player ID、OpenID 和 IGA 绑定 | NOT_TESTED |
| PGS v2 使用自动平台认证与服务端 Auth Code | 弹窗不是完整验收标准 | 验证客户端到后端的 Auth Code 闭环 | NOT_TESTED |
| Unity Plugin v10 及以前使用旧路线 | Unity 工程要同步迁移插件和原生依赖 | 固定 Unity、插件、SDK、Gradle 版本 | NOT_TESTED |
| 加固会改变最终发布候选 | SDK 升级故障与加固故障必须拆开 | Original → Basic → Target → Final 对照 | NOT_TESTED |
| 游戏账号、存档和权益由后端维护 | 客户端登录成功不等于数据恢复成功 | 测试老玩家、换设备和资产读取 | NOT_TESTED |
report_evidence:
report_date: 2026-09-17
pgs_v1_status: DEPRECATED_OR_EXITING
google_sign_in_android_status: NOT_SUPPORTED_FROM_2026_09
games_dependency_v1_api: REMOVED_IN_25_0_0
unity_plugin_migration: NOT_TESTED
pgs_v2_original_release: NOT_TESTED
yudun_basic_candidate: NOT_TESTED
yudun_target_candidate: NOT_TESTED
server_auth_code_exchange: NOT_TESTED
legacy_player_id_binding: NOT_TESTED
openid_or_google_identity_binding: NOT_TESTED
progress_entitlement_restore: NOT_TESTED
final_signed_play_release: NOT_TESTED
production_credentials: CUSTOMER_CONTROLLED_NOT_SHARED
动态时间线与字段时间线
认证迁移不是一次编译任务。建议按版本、账号状态和候选包维护动态时间线,记录依赖升级、身份迁移、服务端回执和最终签名之间的关系。
| 阶段 | 应记录字段 | 责任主体 | 当前状态 |
|---|---|---|---|
| 官方政策复核 | 来源 URL、复核日期、适用 SDK 和地区 | 发行/安全团队 | 已有官方文档,非项目测试 |
| 旧版本盘点 | Unity、Plugin、PGS SDK、旧 GSI/登录调用 | 游戏研发 | NOT_TESTED |
| 账号模型盘点 | PGS Player ID、OpenID、IGA、Guest、绑定关系 | 游戏后端 | NOT_TESTED |
| v2 原始 Release | 依赖、签名、自动认证、手动登录 | 游戏研发/QA | NOT_TESTED |
| Auth Code 闭环 | single-use code、后端交换、玩家校验回执 | 游戏后端 | NOT_TESTED |
| 御盾基础候选 | 输入 Release、保护策略、候选摘要 | 御盾与客户 | NOT_TESTED |
| 御盾目标候选 | IL2CPP、Native、Bridge、登录与恢复路径 | 御盾与客户 | NOT_TESTED |
| 最终 Play Release | 客户签名、包摘要、上传产物、回滚对象 | 发行/签名系统 | NOT_TESTED |
| 迁移复核 | 老玩家、换设备、进度、货币、权益、失败原因 | 游戏后端/客服 | NOT_TESTED |
技术拆解:PGS 平台身份、IGA 与加固候选
PGS Player ID 不是游戏账号数据库
PGS Player ID 是 Play Games 平台的一类身份。游戏可以用它关联平台能力,但玩家的角色、进度、库存、货币和权益应当由游戏自己的身份系统与后端维护。若旧项目把 Player ID 直接写入 IGA 主键,迁移时必须制定兼容映射、冲突处理、账号合并和回滚方案。
OpenID、Google 身份与 IGA 要分层
Google 身份、OpenID、PGS Player ID 和游戏 IGA 不是同一个字段。一个玩家可能先以 Guest 游玩,再绑定 Google;也可能换设备后通过新的认证路径恢复旧 IGA。服务端应保留不可变的内部账号标识,再把外部身份作为可撤销、可审计的关联记录。不要让客户端用一次回调结果直接决定资产归属。
v2 静默认证不等于账号迁移完成
PGS v2 的自动平台认证改善了启动体验,但登录回调成功只代表平台层完成了一步。游戏还要继续验证当前玩家映射、服务端会话、历史进度、库存和权益。对于老玩家,账号映射缺失、多个外部身份指向同一个 IGA、绑定已撤销和跨设备恢复失败都需要单独记录。
Server Auth Code 必须走后端闭环
客户端获取单次 Server Auth Code 后,应通过受保护的会话交给游戏服务器,由服务器完成交换、验证和内部账号绑定。客户端不应内置长期 OAuth 密钥,也不应把“拿到 code”当作支付、资产或存档恢复的最终凭证。服务端要记录 code 的一次性使用、过期、重放和绑定失败原因。
Unity 与 IL2CPP 的边界
Unity 项目迁移时,插件版本、Gradle 依赖、Android 原生回调、IL2CPP 生成代码、ABI、Manifest 和 Play 配置可能同时变化。APP 加固会进一步影响反射、JNI、Native Bridge、初始化时序和最终签名,因此应先让 v2 原始包建立基线,再比较基础候选与目标候选。任何“原包已失败”的场景都优先归入 SDK、插件、账号模型、后端或平台环境排查。
攻防视角:只保留发布与防守方法
认证链的风险不只来自恶意改包,也来自旧插件、旧账号模型、重复提交 code、错误缓存、渠道签名差异和服务端过度信任客户端。防守的重点是让身份关联和发布候选可追踪,让高价值动作需要服务端确认,让迁移失败能够回滚而不是生成第二个玩家账号。
不公开登录绕过、Auth Code 重放、账户合并利用、改包或 Hook 的操作细节。内部授权测试可以记录失败类型和安全回执,对外仅公开字段、状态、责任层和非目标。加固的价值是保护客户端逻辑、完整性、关键回调和候选身份;它不能替代 Google 认证、服务器账号模型或平台 API 的生命周期管理。
工程落地:Game Authentication Release Gate
编译与依赖门
- Unity、Plugin、PGS SDK、Gradle 和 AndroidX 版本固定并可追踪。
- 删除或隔离仍依赖 v1 的接口、适配层和过期调用。
- PGS v2 原始 Release 必须先完成编译、安装和基础认证。
- Google 登录、PGS 平台认证和游戏 IGA 的责任边界写入设计记录。
账号与服务端门
- 新用户、老玩家、Guest、已绑定 Google 和多身份冲突分别测试。
- Player ID、OpenID、IGA、内部账号、进度、货币、库存和权益有明确映射。
- Server Auth Code 一次性使用、交换、过期、重放和失败回执可审计。
- 换设备、覆盖升级、卸载重装和断网恢复不产生无法解释的新账号。
加固与最终发布门
- v2 Original、Yudun Basic、Yudun Target 和 Final Signed Play Release 使用同一业务版本对照。
- 自动认证、手动登录、回调、JNI/Native Bridge、IL2CPP 启动和账号恢复分别验收。
- 最终签名由客户或受控签名系统完成;候选摘要、证书摘要和 Play 上传产物关联可追踪。
- 成就、排行榜、Saved Games、账号恢复和高价值权益路径必须有回滚对象。
风险边界
- 御盾不维护 Google Play Games 平台账号,也不替代 Google 的认证、弃用和 API 生命周期规则。
- 御盾不把 PGS Player ID、OpenID 或 Server Auth Code 直接升级为游戏账号最终结论。
- 御盾不保存客户长期 OAuth 密钥、真实账号、Auth Code、Player ID、支付资产或生产日志。
- APP 加固不能修复 PGS v1 API 删除、Unity Plugin 版本不兼容、服务端映射错误或 Google 平台故障。
NOT_TESTED不等于失败,也不等于通过;它表示需要在客户授权环境继续验证。- 本页不证明任何 Unity、IL2CPP、PGS SDK 或渠道组合都能兼容,具体结果必须绑定版本、签名、设备、账号和服务端配置。
测评目标与非目标
本轮主目标是建立 PGS v1 → v2 迁移下的认证与加固发布门禁;不以文章替代真实账号测试,也不尝试复现登录绕过。
| 测评目标 | 本页处理方式 | 状态 |
|---|---|---|
| 说明 v1/v2 生命周期与依赖风险 | 引用 Google 官方弃用和迁移文档 | 已完成说明 |
| 区分 PGS Player ID、OpenID 与 IGA | 给出身份模型和服务端边界 | NOT_TESTED |
| 建立 Original/Basic/Target/Final 候选矩阵 | 给出发布顺序和字段 | NOT_TESTED |
| 验证 Server Auth Code 后端交换 | 定义链路和回执字段 | NOT_TESTED |
| 验证真实玩家账号、资产、存档 | 不使用真实账号或客户数据 | NOT_TESTED |
| 复现 Auth Code 重放或登录绕过 | 不执行、不发布 | NOT_PERFORMED |
| 证明御盾兼容所有 Unity/PGS 组合 | 不作外推 | NOT_APPLICABLE |
| 规划合法迁移 PoC | 保留脱敏字段与回滚要求 | NOT_TESTED |
常见误区
升级 play-services-games 就算迁移完成了吗?
不是。还要处理插件、认证回调、账号模型、Player ID 映射、Auth Code 后端交换和老玩家恢复。
PGS Player ID 能继续作为游戏唯一账号吗?
不能直接假设。应按官方 v2 模型和项目历史判断,并由游戏后端维护稳定的内部 IGA。
v2 自动认证成功就说明老玩家数据没问题吗?
不说明。平台认证、IGA 映射、进度、货币、库存和权益恢复是不同验收项。
游戏登录失败应该先找加固厂商吗?
如果 v2 原始 Release 已失败,应先排查 SDK、插件、账号模型、服务端、签名和平台配置;只有原包通过而保护候选首次失败时,才进入加固归因。
Auth Code 可以放在客户端长期保存吗?
不应。客户端只处理短期、单次使用的 code,交换和验证应在服务端完成,长期秘密不能依赖 APK 保密。
成就、排行榜和 Saved Games 是否属于认证验收?
是。它们依赖账号和平台能力,登录弹窗成功不能覆盖这些路径。
加固后出现老玩家变新号怎么办?
先比较同一账号、同一服务端、同一 v2 原始包与候选包,检查身份映射和回调参数,再按迁移记录和策略版本回滚;不要直接删除或覆盖旧 IGA。
FAQ
Google Sign-In 停止支持后,PGS v2 还能使用吗?
应按 Google 当前弃用和迁移文档使用受支持的 PGS v2 方案,不再依赖被弃用的旧 Google Sign-In 或 PGS v1 调用。具体可用版本和地区要求应在发布时重新核对官方文档。
Unity 游戏迁移 PGS v2 最先要固定什么?
先固定 Unity、Google Play Games Plugin、PGS SDK、Gradle、Android 依赖和服务端认证协议,然后建立 v2 原始 Release 基线,再进入加固。
御盾负责账号迁移吗?
不负责替代游戏后端的账号真相源。御盾可以保护客户端代码、回调、Native/IL2CPP 关键路径并协助建立候选与最终发布证据;IGA、进度、库存和权益由客户后端管理。
如何判断问题是不是加固导致?
相同账号、服务端、签名、设备和依赖下,先让 v2 原始包通过,再比较 Basic 与 Target 候选。只有原包通过而某一保护级别首次失败,才进入加固模块定位。
为什么要做覆盖升级和换设备测试?
认证迁移可能改变本地凭证、账号关联和服务端会话。新安装通过不代表旧玩家、覆盖升级和跨设备恢复没有断链。
可以把 Player ID、Auth Code 和完整账号记录公开吗?
不可以。公开资料只保留脱敏字段、状态和责任边界;真实身份、code、token、账号和生产日志应留在客户受控系统。
迁移失败的工程归因
认证迁移失败时,建议先把错误拆成四类,而不是统一显示“登录失败”。第一类是构建与依赖错误,例如旧接口在新版本库中被移除、Unity Plugin 与 Gradle 依赖不一致、Manifest 或服务端配置缺失;第二类是平台认证错误,例如 Play Games 服务不可用、账号未授权、平台回调未返回或 Player ID 获取失败;第三类是账号映射错误,例如新身份没有关联旧 IGA、Guest 与 Google 账号绑定冲突、多个外部身份指向不同内部账号;第四类是候选包或签名差异,例如原始包能完成回调而加固候选丢失 JNI/反射入口,或最终签名与测试包不一致。
每一类错误都应保留版本、账号状态、服务端回执、候选摘要和时间,而不是只保存截图。对老玩家尤其要记录迁移前后的内部账号是否相同、存档读取是否来自同一个后端对象、货币和权益是否重新计算、失败后能否回到旧版本。任何涉及资产合并、账号解绑或人工恢复的动作,都要有审批和回滚,不应由客户端直接覆盖。
发布时还要区分“认证通过”和“游戏可运营”。认证通过只能说明某一步身份链可用;成就、排行榜、Saved Games、好友、云存档、支付权益和客服找回仍然需要各自的服务端校验。加固候选应在这些关键路径中逐项回归,保留未覆盖范围。这样,当 Google SDK、Unity 插件、Android 系统或御盾策略再次更新时,团队可以准确知道是哪一层发生变化,而不是重新猜测问题来自哪里。
参考与下一步
建议先选择一个无敏感数据的 Unity Demo,建立 v2 原始包、基础保护候选、目标保护候选和最终签名包四组对象。记录插件、SDK、Unity、IL2CPP、ABI、签名摘要、账号模型、Server Auth Code 回执、Player ID 映射、进度与权益恢复结果,并把每一项未执行内容标为 NOT_TESTED。当基础认证链稳定后,再接入成就、排行榜、Saved Games、换设备和覆盖升级。
如需把游戏认证、IL2CPP、APP 加固和发布验收放入同一条流程,可从Unity IL2CPP 加固发布门禁、游戏数据可信度责任矩阵、Android 设备完整性与 APP 加固和御盾产品页开始。