鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更

一、概述
通过订阅用户信息变更,您可以接收有关用户及其账户的重要更新。当用户取消元服务的授权信息、注销华为账号时,华为账号服务器会发送通知到元服务,元服务可以根据通知消息进行自身业务处理。

二、用户信息变更事件介绍
 

鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更-鸿蒙开发者社区


三、订阅用户信息变更
订阅步骤如下:

1.登录华为开发者联盟,选择“管理中心 > API服务 > API库”。

2.在App Services找到RISC。

鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更-鸿蒙开发者社区

3.点击启用按钮,选择您的项目,点击确定。

鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更-鸿蒙开发者社区

4.点击订阅通知按钮,在弹窗中配置回调地址及订阅范围。

鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更-鸿蒙开发者社区

说明

回调地址:在开启订阅通知后,若华为用户信息存在变更,会通过发送消息到该地址。

订阅范围:订阅的用户信息变更事件,详见用户信息变更事件介绍。

四、处理通知消息
华为账号服务器向元服务投递消息。元服务接收到消息后需要先对消息头中的令牌进行验签,确保消息的完整有效性后解析并获取用户信息变更事件详情。具体步骤如下:

1.验证消息头中的令牌签名。

您可通过任何JWT库(例如:jwt.io)对其进行解析与验证。

无论使用哪种库,您均需完成如下操作:

调用接口(https://risc.cloud.huawei.com/v1beta/public/risc/.well-known/risc-configuration),获取发行者标识(issuer)与签名密钥证书URI(jwks_uri)。

通过依赖的JWT库,对消息头中的令牌进行解析,获取签名的KeyId。

通过签名的KeyId,从签名密钥证书URI中获取到JWT签名的公钥。

校验JWT签名中的aud与订阅用户信息变更中提供的Client ID一致。

校验JWT签名中的issuer与发行者标识(issuer)一致。

具体验签逻辑,请参考如下示例代码:

Maven依赖配置

<dependencies><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.3</version> <!--此处替换为您项目需要的版本--></dependency><dependency>   <groupId>com.auth0</groupId> <artifactId>jwks-rsa</artifactId><version>0.21.2</version> <!--此处替换为您项目需要的版本--></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version> <!--此处替换为您项目需要的版本--></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version> <!--此处替换为您项目需要的版本--></dependency>
</dependencies>

    Java验签代码示例

    import com.auth0.jwk.JwkProvider;
    import com.auth0.jwk.UrlJwkProvider;
    import com.github.benmanes.caffeine.cache.CacheLoader;
    import com.github.benmanes.caffeine.cache.Caffeine;
    import com.github.benmanes.caffeine.cache.LoadingCache;
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Header;
    import io.jsonwebtoken.IncorrectClaimException;
    import io.jsonwebtoken.JwsHeader;
    import io.jsonwebtoken.Jwt;
    import io.jsonwebtoken.JwtParser;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SigningKeyResolver;
    import io.jsonwebtoken.security.SignatureException;
    import org.checkerframework.checker.nullness.qual.NonNull;
    import org.checkerframework.checker.nullness.qual.Nullable;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.Key;
    import java.security.PublicKey;
    import java.util.Objects;
    import java.util.concurrent.TimeUnit;public class RiscDemo {public static void main(String[] args) {// 消息请求头中Authorization: Bearer <token>中的<token>String token = "
    <token>
    ";// Client IDString clientId = "
    <Client ID>
    ";Jwt<?, Object> jwt = validateSecurityEventToken(token, clientId);if (Objects.isNull(jwt)) {// 验签失败,进行自己逻辑处理} else {// 验签成功,进行自己逻辑处理}}/*** 对Authorization头域中的token进行验签** @param token 消息请求头中Authorization: Bearer <token>中的<token>* @param clientId Client ID** @return 返回为null,则表示验签失败,否则表示验证成功*/public static <H extends Header<H>, B> Jwt<H, B> validateSecurityEventToken(String token, String clientId) {Jwt<H, B> jwt = null;try {/*** 公开配置信息地址:https://risc.cloud.huawei.com/v1beta/public/risc/.well-known/risc-configuration* 公开配置信息中的issuer值*/String issuer = "id.cloud.huawei.com";// 公开配置信息中的jwks_uri值String jwksUri = "https://risc.cloud.huawei.com/v1beta/public/risc/certs";// 获取公钥信息JwkProvider huaweiCerts = new UrlJwkProvider(new URL(jwksUri), null, null);LoadingCache<String, PublicKey> cache = Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.DAYS).build(new CacheLoader<String, PublicKey>() {@Overridepublic @Nullable PublicKey load(@NonNull String key) throws Exception {return huaweiCerts.get(key).getPublicKey();}});SigningKeyResolver signingKeyResolver = new SigningKeyResolver() {private PublicKey getPublicKey(JwsHeader<?> jwsHeader) {try {return cache.get(jwsHeader.getKeyId());} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic Key resolveSigningKey(JwsHeader jwsHeader, Claims claims) {return getPublicKey(jwsHeader);}@Overridepublic Key resolveSigningKey(JwsHeader jwsHeader, String s) {return getPublicKey(jwsHeader);}};// 验证并解析消息内容JwtParser parser = Jwts.parserBuilder().requireIssuer(issuer).requireAudience(clientId).setAllowedClockSkewSeconds(60).setSigningKeyResolver(signingKeyResolver).build();jwt = parser.parse(token);} catch (IncorrectClaimException e) {// 消息的claim无效,针对异常进行处理(如:日志记录)e.printStackTrace();} catch (SignatureException e) {// 验签失败,针对异常进行处理(如:日志记录)e.printStackTrace();} catch (MalformedURLException e) {// 无效的jwksUri,检查传入的jwksUri是否与https://risc.cloud.huawei.com/v1beta/public/risc/.well-known/risc-configuration返回jwks_uri一致e.printStackTrace();} catch (Exception e) {// 其他异常,业务自行处理e.printStackTrace();}return jwt;}
    }

      2.处理消息体。

      消息体格式如下

      {"aud": "<
      开发者Client ID
      >","iss": "id.cloud.huawei.com","iat": 1727619834,"jti": "6672ed7d5c5e4c3c92f343ecac40f326","events": {"https://schemas.openid.net/secevent/risc/event-type/account-purged": {"subject": {"sub": "<
      触发事件用户的UnionID
      >","subject_type": "iss_sub","extra": "<
      触发事件用户的OpenID
      >","iss": "id.cloud.huawei.com"}}}
      }
      

        其中,各字段含义如下:
         

        鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更-鸿蒙开发者社区


        本文主要引用参考HarmonyOS官方网站

        本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902167.shtml

        如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

        相关文章

        buildroot构建根文件系统报错(已解决大部分问题)

        title: buildroot构建根文件系统报错(set FORCE_UNSAFE_CONFIGURE1) author: cbus categories: 小知识 tags:小知识 abbrlink: 53691 date: 2025-04-20 08:03:00 错误1 set FORCE_UNSAFE_CONFIGURE1 在使用buildroot构建根文件系统时&#xff0c;一切按照文档的配置&#xff0…

        7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

        font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

        通过面向目标的奖励弥合人与机器人的灵活性差距

        24年10月来自纽约大学的论文“Bridging the Human to Robot Dexterity Gap through Object-Oriented Rewards”。 直接通过人类视频训练机器人是机器人技术和计算机视觉领域的一个新兴领域。尽管双指机械手在双指夹持器方面取得了显著进展&#xff0c;但以这种方式让多指机械手…

        C++入门篇(下)

        目录 1、引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.4.1 引用做参数 1.4.2 引用做返回值 1.5 引用和指针的区别 2、内联函数 2.1 概念 2.2 特性 3、auto关键字 4、基于范围的for循环 5、指针空值nullptr 5.1 C98 中的指针空值处理 5.2 C11 …

        Multi-Query Attention (MQA) PyTorch 实现

        和多头注意力机制的唯一区别&#xff1a;K、V在不同的head之间实现了复用&#xff0c;而对于不同的头&#xff0c;Q依然不同。 因此这里的代码和标准多头注意力的实现也是几乎完全一样&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass…

        visual studio无法跳转到函数定义、变量定义、跳转函数位置不准问题解决

        参考&#xff1a;https://blog.csdn.net/snakehacker/article/details/135438353 程序有时会出现大部分函数都不能准确的从头文件中正确定位到函数定位,这是因为数据库错乱造成的,可以通过重构数据库来解决,操作方法如下&#xff1a; 菜单栏&#xff1a;工具——选项 文本编辑…

        Java优雅实现判空方法

        在 Java 开发中&#xff0c;频繁的 if (obj ! null) 判空代码会导致代码冗余、可读性差&#xff0c;且容易遗漏判空导致 NullPointerException。以下从 语言特性、设计模式、工具类 和 编码规范 四个维度&#xff0c;结合实际案例&#xff0c;详解如何优雅处理空值问题。 一、…

        京东百亿补贴杀入外卖市场:一场关乎即时零售未来的攻防战

        当美团和饿了么在外卖市场双雄争霸十余年之际&#xff0c;京东突然以"百亿补贴免佣金"的组合拳高调入场。这场看似跨界的外卖大战&#xff0c;实则是互联网巨头对万亿级即时零售市场的生死争夺。 外卖只是表象&#xff0c;即时零售才是终极战场 京东黑板报4月10日官…

        UNION和UNION ALL的主要区别

        UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下&#xff1a; 1、对重复结果的处理&#xff1a;UNION在进行表链接后会筛选掉重复的记录&#xff0c;而UNION ALL不会…

        七段码 路径压缩 并查集 dfs

        12.七段码 - 蓝桥云课 将七个二极管映射为 1-7 开一个二维矩阵 为 相邻的边连上线 edge[1][2] edge[1][6] 1;edge[2][1] edge[2][3] edge[2][7] 1;edge[3][2] edge[3][4] edge[3][7] 1;edge[4][3] edge[4][5] 1;edge[5][4] edge[5][6] edge[5][7] 1;edge[6][1…

        科技如何改变世界?

        技术是我们日常生活中不可或缺的一部分&#xff0c;以至于我们常常忘记了它的重要性。如果你正在科技领域工作&#xff0c;或者希望进入该领域&#xff0c;你可能是众多有使命感的人之一&#xff0c;希望知道自己的日常工作能为社会或地球的长远利益做出贡献。 别再四处寻找了…

        抽象的https原理简介

        前言 小明和小美是一对好朋友&#xff0c;他们分隔两地&#xff0c;平时经常写信沟通&#xff0c;但是偶然被小明发现他回给小美的信好像被人拆开看过&#xff0c;甚至偷偷被篡改过。 对称加密算法 开头的通信过程比较像HTTP服务器与客户端的通信过程&#xff0c;全明文传输…

        高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?

        如果有遗漏,评论区告诉我进行补充 面试官: Nacos如何处理网络分区情况下的服务可用性问题&#xff1f; 我回答: 在讨论 Nacos 如何处理网络分区情况下的服务可用性问题时&#xff0c;我们需要深入理解 CAP 理论以及 Nacos 在这方面的设计选择。Nacos 允许用户根据具体的应用…

        python解压文件 zip tar.gz tar.xz

        以下代码为解压zip包 tar包文件 zip_path&#xff1a;文件绝对路径 output_folder&#xff1a;文件解压后存放的文件夹路径 def extract_file(zip_path, output_folder):# 支持解压zip tar tar.gz tar.xz .tar.bz2# 确保输出文件夹存在os.makedirs(output_folder, exist_okT…

        网络基础(协议,地址,OSI模型、Socket编程......)

        目录 一、计算机网络发展 二、协议 1.认识协议 2.OSI七层模型 3.TCP/IP 五层(或四层)模型 4.协议本质 三、网络传输流程 1.MAC地址 2.协议栈 3.IP地址 IP地址 vs MAC地址 1. 核心区别 2. 具体通信过程类比 3. 关键总结 为什么需要两者&#xff1f; 4.协议栈图解…

        生成式AI对话中提示词策略:明确问题、明确目标和提供背景信息是最有效的策略

        生成式AI对话中提示词策略:明确问题、明确目标和提供背景信息是最有效的策略 最有效的提示词策略包括明确问题、明确目标和提供背景信息。普适性有效提示词策略可分为三类:明确需求与精确指引型、清晰解释与逻辑排序型、拆解任务与多样化表达型。[局限]数据来源于中国用户,…

        AtCoder ABC402 ABCD

        A - CBC 把大写字母按顺序连起来 B - Restaurant Queue 一眼队列&#xff0c;stl模拟就行 C - Dislike Foods 显然&#xff0c;每次克服暴力枚举每个菜肴会超时。 然而题目中给了每个菜肴的配菜个数&#xff0c;不妨换过来统计每个配菜用在了哪些菜肴。每次克服时&#x…

        Transformer 架构 - 解码器 (Transformer Architecture - Decoder)

        欢迎回到我们的 Transformer 系列教程!在上一篇中,我们详细探讨了 Transformer 的编码器,它负责将输入的源序列(比如源语言句子)转换为一系列包含丰富上下文信息的向量表示。 现在,我们将把目光投向 Transformer 的另一半——解码器 (Decoder)。解码器负责接收编码器的输…

        神经网络与模型训练过程笔记

        1.专有名词 ANN 人工神经网络&#xff0c;一种受生物神经元启发的监督学习算法。输入数据通过网络中的层级函数传递&#xff0c;激活特定神经元。函数复杂度越高&#xff0c;模型对数据的拟合能力越强&#xff0c;预测精度越高。 偏置项 其中x下表从1开始的是输入变量&#xf…

        【计算机网络 | 第二篇】常见的通信协议(一)

        HTTP和HTTPS有什么区别&#xff1f; 端口号&#xff1a;HTTP默认是80端口&#xff0c;HTTPS默认是443。 URL前缀&#xff1a;HTTPHTTP 的 URL 前缀是 http://&#xff0c;HTTPS 的 URL 前缀是 https://。 安全性和资源消耗&#xff1a;HTTP协议运行在TCP上&#xff0c;都是明…