HarmonyOS 鸿蒙Next 使用华为账号登录按钮没有用户授权弹窗直接获取authorizationCode等信息

HarmonyOS 鸿蒙Next 使用华为账号登录按钮没有用户授权弹窗直接获取authorizationCode等信息

// 构造LoginWithHuaweiIDButton组件的控制器
controller: loginComponentManager.LoginWithHuaweiIDButtonController =
new loginComponentManager.LoginWithHuaweiIDButtonController()
/**
* 当应用使用自定义的登录页时,如果用户未同意协议,需要设置协议状态为NOT_ACCEPTED,当用户同意协议后再设置
* 协议状态为ACCEPTED,才可以使用华为账号一键登录功能
*/
.setAgreementStatus(loginComponentManager.AgreementStatus.NOT_ACCEPTED)
.onClickLoginWithHuaweiIDButton((error: BusinessError | undefined,
response: loginComponentManager.HuaweiIDCredential) => {
this.handleLoginWithHuaweiIDButton(error, response);
})
.onClickEvent((error: BusinessError, clickEvent: loginComponentManager.ClickEvent) => {
if (error) {
this.dealAllError(error);
return;
}
hilog.info(this.domainId, this.logTag, onClickEvent clickEvent: ${clickEvent});
});

//打印authorizationCode 

handleLoginWithHuaweiIDButton(error: BusinessError | undefined,
response: loginComponentManager.HuaweiIDCredential) {
if (error) {
hilog.error(this.domainId, this.logTag,
Failed to click LoginWithHuaweiIDButton. errCode is ${error.code}, errMessage is ${error.message});
if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) {
AlertDialog.show(
{
message: “网络未连接,请检查网络设置。”,
offset: { dx: 0, dy: -12 },
alignment: DialogAlignment.Bottom,
autoCancel: false,
confirm: {
value: “知道了”,
action: () => {
}
}
}
);
} else if (error.code === ErrorCode.ERROR_CODE_AGREEMENT_STATUS_NOT_ACCEPTED) {
// 未同意协议,弹出协议弹框,推荐使用该回调方式
this.agreementDialog.open();
} else if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {
// 华为账号未登录提示
this.showToast(“华为账号未登录,请重试”);
} else if (error.code === ErrorCode.ERROR_CODE_NOT_SUPPORTED) {
// 不支持该scopes或permissions提示
this.showToast(“该scopes或permissions不支持”);
} else {
// 其他提示系统或服务异常
console.info(‘error.code:========’ + error.code)
this.showToast(‘服务或网络异常,请稍后重试’);
}
return;
}
try {
if (this.isSelected) {
if (response) {
hilog.info(this.domainId, this.logTag, ‘Succeeded in clicking LoginWithHuaweiIDButton.’);
// 开发者根据实际业务情况使用以下信息
const authCode = response.authorizationCode;
const openID = response.openID;
const unionID = response.unionID;
const idToken = response.idToken;

let httpRequest = http.createHttp();


console.info(‘authCode===’ + authCode)
console.info(‘idToken===’ + idToken)
console.info(‘openID===’ + openID)
console.info(‘unionID===’ + unionID)

}

}

5 回复

您好!您的疑问和另一篇帖子类似,您看这篇帖子的回复能解决你的疑问吗?

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201167801180907221&fid=0109140870620153026

您提到的用户授权流程,可能前移到应用在开发前的权限申请当中,保证每个应用使用华为账号一键登录功能之前,需要完成quickLoginMobilePhone(华为账号一键登录)的scope权限申请;

在开发时,调用authentication模块的AuthorizationWithHuaweiIDRequest请求获取华为账号用户的UnionID、OpenID、匿名手机号;

具体开发流程请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/account-phone-unionid-login-V13

更多关于HarmonyOS 鸿蒙Next 使用华为账号登录按钮没有用户授权弹窗直接获取authorizationCode等信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


没有使用(华为账号一键登录),使用的(华为账号登录)。我想要的弹窗参考

https://developer.huawei.com/consumer/cn/forum/topic/0208168108056684537?fid=0109140870620153026

授权弹窗是什么样子的?用户协议和隐私政策的弹窗?还是授权登录弹框?

针对HarmonyOS 鸿蒙Next使用华为账号登录按钮没有用户授权弹窗直接获取authorizationCode等问题,这通常是由于权限申请流程或配置不当导致的。以下是一些可能的解决方案:

  1. 检查权限声明:确保在应用的配置文件中(如“module.json5”)已正确声明所需的用户授权权限,包括华为账号登录相关的权限。
  2. 动态请求权限:在需要获取用户授权时,应使用“requestPermissionsFromUser()”接口动态向用户请求权限,而非直接尝试获取authorizationCode。
  3. 检查授权状态:在请求权限前,可使用“checkAccessToken()”函数检查当前权限的授予状态,以避免不必要的权限请求。
  4. 遵循官方文档:严格遵循HarmonyOS官方文档中的权限申请和用户授权流程,确保所有步骤均正确无误。

如果以上步骤均无法解决问题,可能是系统或SDK的bug,建议联系HarmonyOS的官方客服以获取进一步的技术支持。官网客服地址是:https://www.itying.com/category-93-b0.html

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!