鴻蒙應用元服務開發-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.pswp.cn/news/902167.shtml
        繁體地址,請注明出處:http://hk.pswp.cn/news/902167.shtml
        英文地址,請注明出處:http://en.pswp.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;都是明…