首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
HarmonyOS
发新帖
0
0
[原创]通过华为账号识别用户风险,降低业务损失
发表于: 2026-1-22 10:10
8657
[原创]通过华为账号识别用户风险,降低业务损失
HarmonyOS SDK
2026-1-22 10:10
8657
当应用平台组织诸如秒杀、抽奖等营销活动时,经常会遭遇"薅羊毛"行为,给业务方带来不小的经费损失。比如通过虚假手机号进行批量注册,多次参加活动;又比如,当应用商户进行红包补贴、优惠券发放等营销活动时,使用脚本或模拟器"薅羊毛"。 为避免该问题,HarmonyOS SDK华为[账号服务](<mark class="encrypted">6ceK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3M7$3c8C8i4K6u0r3j5h3y4U0L8%4g2F1N6q4)9J5k6r3E0A6N6q4)9K6c8X3S2S2i4K6g2X3M7$3!0#2M7X3y4W2i4K6y4p5K9r3#2K6x3b7`.`.</mark> "账号服务")(Account Kit)提供了获取用户风险等级的能力,能够有效识别恶意场景,提前防范业务风险。 ### 应用场景 一、应用登录风控场景: 当用户使用华为账号关联登录应用时,开发者可通过华为账号获取用户风险等级的能力获取用户账号的风险等级,对高风险等级账号进行风控,提升应用的安全等级。 二、营销活动反作弊场景: 在应用进行营销活动期间,如进行商户补贴、优惠券发放等商业营销活动时获取华为账号风险等级,协助开发者有效识别"薅羊毛"风险;保护营销资源合理使用,降低业务安全问题给营销方带来的损失,为相关活动保驾护航。 ### 风险等级  ### 获取用户风险等级方式 一、 通过华为账号一键登录获取用户风险等级。 在应用登录风控场景中,开发者可以通过华为账号一键登录获取用户风险等级,对恶意账号进行风控,提升应用的安全等级。 大致业务流程如下:  通过华为账号一键登录获取用户风险等级的开发,需要建立在一键登录的开发基础上。在进行代码开发前,请确认已经完成一键登录的开发准备工作,然后申请对应的scope权限,接着就可以进行客户端部分的开发。 在客户端开发部分,需要参考[一键登录开发流程步骤](<mark class="encrypted">148K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3j5h3y4U0L8%4g2F1N6q4)9J5k6s2m8Z5L8$3&6W2i4K6u0V1N6h3&6A6L8$3&6A6k6q4)9J5k6r3I4G2k6$3W2F1i4K6y4r3K9r3q4Q4y4h3k6K6L8%4g2J5j5$3g2Q4x3@1c8Z5L8i4x3I4i4K6t1K6M7$3g2U0N6r3W2G2L8U0b7@1y4K6l9I4z5e0x3%4x3e0M7J5z5e0t1H3</mark> "一键登录开发流程步骤")1及步骤2,确保系统账号已登录,匿名手机号获取成功,且用户首次通过华为账号登录该应用。接着再参考步骤3的示例代码,在LoginWithHuaweiIDButton组件参数params中设置riskLevel标识为true,其余示例代码保持不变,拉起应用登录页。 LoginWithHuaweiIDButton({ params: { // LoginWithHuaweiIDButton支持的样式 style: loginComponentManager.Style.BUTTON_RED, // 账号登录按钮在登录过程中展示加载态 extraStyle: { buttonStyle: new loginComponentManager.ButtonStyle().loadingStyle({ show: true }) }, // LoginWithHuaweiIDButton的边框圆角半径 borderRadius: 24, // LoginWithHuaweiIDButton支持的登录类型 loginType: loginComponentManager.LoginType.QUICK_LOGIN, // LoginWithHuaweiIDButton支持按钮的样式跟随系统深浅色模式切换 supportDarkMode: true, // verifyPhoneNumber:如果华为账号用户在过去90天内未进行短信验证,是否拉起Account Kit提供的短信验证码页面 verifyPhoneNumber: true, // riskLevel:标识应用期望在登录后获取华为账号的风险等级 riskLevel: true, }, controller: this.controller }) 用户同意协议并点击一键登录按钮后,可获取到Authorization Code,并在服务端使用Client ID、Client Secret、Authorization Code调用[获取用户级凭证接口](<mark class="encrypted">77cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1M7X3g2X3k6i4u0W2L8X3y4W2M7#2)9J5c8X3q4U0j5$3!0#2L8Y4c8Q4x3X3c8S2M7r3W2Q4x3X3c8G2j5Y4c8S2K9h3&6Q4x3X3c8#2M7$3g2J5i4K6u0V1N6r3!0C8k6h3&6Q4x3@1k6Z5j5g2)9#2k6Y4y4G2N6i4u0U0k6g2)9K6c8r3S2E0M7K6q4Q4x3U0y4K6k6h3y4@1K9h3!0F1x3e0l9^5y4e0V1H3x3e0x3I4x3K6f1%4z5b7`.`.</mark> "获取用户级凭证接口")向华为账号服务器请求获取Access Token,最后使用Access Token调用获取用户风险等级接口获取用户的风险等级。 import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * 获取用户风险等级 */ @Slf4j public class GetUserRiskLevelDemo { public static void main(String[] args) throws IOException { // 获取用户风险等级的接口URL String url = "<mark class="encrypted">d7bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2j5$3y4G2N6h3&6@1i4K6u0W2j5$3I4G2N6h3c8Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7$3g2J5i4K6u0r3k6$3g2@1N6i4y4W2M7Y4u0A6M7$3E0D9k6i4k6W2L8l9`.`.</mark>"; // 替换为您实际的Client ID String clientID = "<Client ID>"; // 替换为您实际的transactionID String transactionID = "<transactionID>"; // 替换为您实际的获取到的用户级凭证Access Token String accessToken = "<Access Token>"; // 替换为您实际的scene String scene = "<scene>"; JSONObject result = getUserRiskLevel(url, clientID, transactionID, accessToken, scene); // 解析获取errCode Integer errCode = result.getInteger("errCode"); // 解析获取errMsg String errMsg = result.getString("errMsg"); // 解析获取riskLevel Integer riskLevel = result.getInteger("riskLevel"); // 解析获取riskTag JSONArray riskTag = result.getJSONArray("riskTag"); } private static JSONObject getUserRiskLevel(String url, String clientID, String transactionID, String accessToken, String scene) throws IOException { HttpPost httpPost = new HttpPost(url + "?" + "clientID=" + clientID + "&transactionID=" + transactionID); Map<String, String> reqBody = new HashMap<>(); reqBody.put("accessToken", accessToken); reqBody.put("scene", scene); httpPost.setHeader("Content-Type", "application/json;charset=utf-8"); httpPost.setEntity(CallUtils.wrapJsonEntity(reqBody)); return CallUtils.toJsonObject(CallUtils.remoteCall(httpPost, (CloseableHttpResponse response, String rawBody) -> { int statusCode = response.getStatusLine().getStatusCode(); // http状态码不是200,请求失败 if (statusCode != 200) { return new IOException("call failed! http status code: " + statusCode + ", response data: " + rawBody); } // http状态码为200,解析响应的body,判断业务错误码 JSONObject errorResponseBody = CallUtils.toJsonObject(rawBody); // 错误码 Integer errCode = errorResponseBody.getInteger("errCode"); // errCode为0表示成功,非0表示失败 if (Objects.nonNull(errCode) && errCode != 0) { return new IOException("call failed! http status code: " + statusCode + ", response data: " + rawBody); } return null; })); } } 二、 通过华为账号其他方式登录获取用户风险等级。 在应用已使用华为账号关联登录的场景中,开展商户补贴、优惠券发放等商业营销活动时,开发者可通过华为账号其他方式登录获取华为账号风险等级,有效识别"薅羊毛"风险,保护营销资源合理使用。 大致业务流程如下:  通过华为账号其他方式登录获取用户风险等级的开发步骤同样分为客户端开发和服务端开发。客户端开发步骤如下: 1. 首先导入authentication模块及相关公共模块。 import { authentication } from '@kit.AccountKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { util } from '@kit.ArkTS'; import { BusinessError } from '@kit.BasicServicesKit'; 2. 然后创建授权请求并设置参数。 // 创建授权请求,并设置参数 const authRequest = new authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest(); // 获取风险等级需要传如下scope authRequest.scopes = ['riskLevel']; // 获取authorizationCode需传如下permission authRequest.permissions = ['serviceauthcode']; // 用户是否需要登录授权,该值为true且用户未登录或未授权时,会拉起用户登录或授权页面 authRequest.forceAuthorization = true; // 用于防跨站点请求伪造 authRequest.state = util.generateRandomUUID(); 3. 调用AuthenticationController对象的executeRequest方法执行授权请求,并处理授权结果,从授权结果中解析出authorizedScopes和Authorization Code。 // 执行授权请求 try { // 此示例为代码片段,实际需在自定义组件实例中使用,以获取UIContext对象作为函数入参 const controller = new authentication.AuthenticationController(this.getUIContext().getHostContext()); controller.executeRequest(authRequest).then((data) => { const authorizationWithHuaweiIDResponse = data as authentication.AuthorizationWithHuaweiIDResponse; const state = authorizationWithHuaweiIDResponse.state; if (state && authRequest.state !== state) { hilog.error(0x0000, 'testTag', `Failed to authorize. The state is different, response state: ${state}`); return; } hilog.info(0x0000, 'testTag', 'Succeeded in authentication.'); let riskLevelAuthorized: boolean = false; const authorizationWithHuaweiIDCredential = authorizationWithHuaweiIDResponse?.data; const authorizedScopes = authorizationWithHuaweiIDCredential?.authorizedScopes; // 判断授权成功scopes中是否包含riskLevel if (authorizedScopes?.includes("riskLevel")) { riskLevelAuthorized = true; } const authorizationCode = authorizationWithHuaweiIDCredential?.authorizationCode; // 开发者处理riskLevelAuthorized, authorizationCode }).catch((err: BusinessError) => { dealAllError(err); }); } catch (error) { dealAllError(error); } // 错误处理 function dealAllError(error: BusinessError): void { hilog.error(0x0000, 'testTag', `Failed to obtain userInfo. Code: ${error.code}, message: ${error.message}`); // 在应用获取用户风险等级场景下,涉及UI交互时,建议按照如下错误码指导提示用户 if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) { // 用户未登录华为账号,请登录华为账号并重试 } else if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) { // 网络异常,请检查当前网络状态并重试 } else if (error.code === ErrorCode.ERROR_CODE_USER_CANCEL) { // 用户取消授权 } else if (error.code === ErrorCode.ERROR_CODE_SYSTEM_SERVICE) { // 系统服务异常,请稍后重试 } else if (error.code === ErrorCode.ERROR_CODE_REQUEST_REFUSE) { // 重复请求,应用无需处理 } else { // 获取用户信息失败,请稍后重试 } } export enum ErrorCode { // 账号未登录 ERROR_CODE_LOGIN_OUT = 1001502001, // 网络错误 ERROR_CODE_NETWORK_ERROR = 1001502005, // 用户取消授权 ERROR_CODE_USER_CANCEL = 1001502012, // 系统服务异常 ERROR_CODE_SYSTEM_SERVICE = 12300001, // 重复请求 ERROR_CODE_REQUEST_REFUSE = 1001500002 } 4. 在客户端开发完成后,同样需要调用获取用户级凭证接口向华为账号服务器请求获取Access Token,并使用Access Token调用获取用户风险等级接口获取用户的风险等级。 **了解更多详情\>\>** 访问[华为账号服务联盟官网](<mark class="encrypted">4dfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3M7$3c8C8i4K6u0r3j5h3y4U0L8%4g2F1N6q4)9J5k6r3E0A6N6q4)9J5c8W2)9K6c8X3S2S2i4K6g2X3M7$3!0#2M7X3y4W2i4K6y4p5K9r3#2K6x3b7`.`.</mark> "华为账号服务联盟官网") 获取[获取风险等级开发指导文档](<mark class="encrypted">4cfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3j5h3y4U0L8%4g2F1N6q4)9J5k6r3N6W2N6q4)9J5k6s2u0A6M7$3E0D9k6i4k6W2L8q4)9K6c8X3S2S2i4K6g2X3M7$3!0#2M7X3y4W2i4K6y4p5K9r3#2K6x3b7`.`.</mark> "获取风险等级开发指导文档")
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
mb_eekvgidg
雪 币:
249
活跃值:
(175)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
28
粉丝
0
关注
私信
mb_eekvgidg
2
楼
很有内涵,能联系我吗137334010(企鹅
2026-4-7 19:00
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
HarmonyOS SDK
258
发帖
190
回帖
0
RANK
关注
私信
他的文章
[原创]HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
270
[原创]AI 赋能 Push Kit 场景化消息开发,高效完成鸿蒙应用推送能力接入
472
[原创]HarmonyOS Push Kit 自分类权益 Skill,助力提升权益申请通过率
521
[原创]基于增强QUIC协议优化弱网下的直播观看体验
697
[原创]焕新鸿蒙应用权限管理方案,应用授权体验再升级
609
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部