账号介绍
华为帐号是用户访问华为云业务的凭证,拥有华为帐号的用户,可以使用华为云业务,如华为云服务、华为游戏中心、华为应用市场等。
华为帐号的开放基于OAuth2.0协议标准,在获得用户授权后,应用可以获取用户在华为帐号系统的基本信息,如OpenID、AccessToken、用户昵称、头像等。
目前客户端主要开放的帐号登录授权有两种模式:简化模式和授权码模式。
适用场景场景一:获取用户手机号信息
购物类快应用通过获取用户手机号,给用户手机推送商品的促销通知。
场景二:获取用户邮箱信息
阅读类的快应用通过获取用户邮箱,给用户邮箱发送热门书籍信息。
场景三: 华为账号与应用内账号统一
快应用开发者无需建立自己的账号体系,能够快速开发上线,直接利用华为账号体系方便快捷地管理自身用户。
开发准备-
确认已在“华为开发者联盟”申请帐号服务。
如果尚未申请,请参考“开通帐号服务”进行申请。
-
安装华为快应用IDE。
华为帐号登录是华为扩展接口,而非厂商联盟规范,请使用华为快应用IDE进行接入。
-
如果需要获取华为帐号的手机号、EMAIL信息,需向华为发送邮件申请华为帐号手机号/EMAIL权限。
申请权限方式:下载快应用-华为帐号手机号、EMAIL权限申请表(应用名称&应用ID).xlsx,填写完成后,发送邮件至华为开发者客服邮箱(developer@huawei.com)进行申请,华为方审核通过后为开发者进行相关配置工作。
开发步骤● 简化模式
可直接通过在快应用中调用授权接口返回AccessToken,AccessToken有效期默认为3600秒,当AccessToken失效后需要重新调用接口授权获取。
● 授权码模式(Authorization Code)
使用Authorization Code(授权码)获取Access Token的授权流程又被称为Web Server Flow,适用于所有Server端的应用。
授权流程分为两步:
在快应用中调用授权接口获取Authorization Code。
快应用获取Authorization Code后,通过华为提供的服务端接口获取AccessToken,Refresh Token等。
如下以获取用户手机号信息为例进行介绍。
简化模式
1. 在快应用中调用 account.getProvider 接口判断当前设备是否支持华为帐号服务。
调用接口返回 huawei 表示支持,否则表示不支持。后续功能开发和接口调用必须在设备支持帐号服务的前提进行。
console.log(account.getProvider())
2. 在快应用中调用 account.authorize 接口直接获取accessToken,传入参数scope配置为scope.mobileNumber。
account.authorize({
appid: "101373095",
type: "token",
state: "feedbeef",
scope: "scope.mobileNumber",
success: function (data) {
console.log("signInByBaseScope Authorize base profile success.");
var accessToken = data.accessToken;
console.log("signInByBaseScope Authorize base profile success data=" + JSON.stringify(data));
},
fail: function (data, code) {
console.log("signInByBaseScope Authorize base profile fail, code=" + code);
prompt.showToast({ message: data + "fail code: " + code })
}
});
3. 通过 account.getPhoneNumber 获取用户手机号码信息。
getPhoneNumber() {
account.authorize({
appid: "101373095",
type: "token",
state: "feedbeef",
scope: “scope.mobileNumber”, //此处必须设置为scope.mobileNumber
success: function (data) {
console.log("getPhoneNumber Authorize mobileNumber profile success data=" + JSON.stringify(data));
account.getPhoneNumber({
appid: "101373095",
token: data.accessToken,
encrypt: "true",
success: function (data) {
console.log("getPhoneNumber get mobile number success, number=" + data.phoneNumber);
prompt.showToast({ message: 'phone number:' + data.phoneNumber })
},
fail: function (data, code) {
console.log("getPhoneNumber get mobile number fail, code=" + code);
prompt.showToast({ message: data + "fail code: " + code })
}
})
},
fail: function (data, code) {
console.log("getPhoneNumber Authorize base profile fail, code=" + code);
prompt.showToast({ message: data + "fail code: " + code })
}
});
},
授权码模式
1. 在快应用中调用 account.getProvider 接口判断当前设备是否支持华为帐号服务。
调用接口返回 huawei 表示支持,否则表示不支持。后续功能开发和接口调用必须在设备支持帐号服务的前提进行。
console.log(account.getProvider())
2. 判断是否需要重新获取Authorization Code。未获取过Authorization Code,或者已获取Authorization Code,但是调用 account.checkUserSession 接口校验无效,则执行步骤3。account.checkUserSession 校验有效,表示当前会话持续有效,则执行步骤4。
account.checkUserSession({
success: function (data2) {
// 有效
},
fail: function (data, code) {
// 无效
}
});
3. 在快应用中调用 account.authorize 接口获取Authorization Code。
account.authorize({
appid: "101373095",
type: "code",
state: 5,
scope: "scope.mobileNumber",
redirectUri: "http://www.example.com/",
success: function (ret) {
var atcode = ret.code;
console.log("signInByBaseScope Authorize base profile success data=" + JSON.stringify(ret));
},
fail: function (erromsg, errocode) {
prompt.showToast({ message: 'authorize fail --- ' + errocode + ':' + erromsg });
}
})
注意:
每一个Authorization Code的有效期为5分钟,并且只能使用一次,再次使用将无效。
4. 调用华为服务端Code获取AT接口,获取Access Token。
获取Access Token方式:快应用客户端调用fetch.fetch接口发送请求(使用POST方式)到华为OAuth2.0授权服务的“https://login.cloud.huawei.com/oauth2/v2/token”地址上,并在请求的body体中带上以下5个必选参数:
注意:传入参数值需要先进行URLEncode编码处理。
-
grant_type:必选参数,此值固定为“authorization_code”。
-
code:必选参数,获取的Authorization Code。
-
client_id:必须参数,在华为开发者联盟创建应用后获取的APP ID。
-
client_secret:必选参数,在华为开发者联盟创建应用后获取的APP SECRET。
-
redirect_uri:必选参数,此值固定为“hms://redirect_url”。
示例代码如下:
postjson: function () {
var str ='{"grant_type":"authorization_code","code":"Etersdfasgh74ddga%3d","client_id":"12345","client_secret":"0rDdfgyhytRtznPQSzr5pVw2","redirect_uri":"hms%3A%2F%2Fredirect_url"}'
fetch.fetch({
url: 'https://login.cloud.huawei.com/oauth2/v2/token',
data: JSON.parse(str),
header: {'User-Agent': 'Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; STF-AL00 Build/HUAWEISTF-AL00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.9 Mobile Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,en-US;q=0.8,en;q=0.6', 'Content-Type':'application/x-www-form-urlencoded'},
responseType: 'json',
method: 'POST',
success: function (ret) {
console.log(JSON.stringify(ret.data))
prompt.showToast({
message: 'success'
})
},
fail: function (msg, code) {
console.log(msg, code)
},
complete: function () {
console.log('complete')
}
})
}
若参数无误,服务器将返回一段JSON文本,主要包含以下参数:
-
access_token:需要获取的Access Token(如果包含\,必须去除所有的\)。
-
expires_in:Access Token的有效期,以秒为单位。
-
refresh_token:用于刷新Access Token的Refresh Token,所有应用都会返回该参数。
-
scope:Access Token最终的访问范围,即用户实际授予的权限列表。
示例如下:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "346346sdxcdfsa3566546dfdfgfg=",
"expires_in": 3600,
"refresh_token": "68dieddfg08349786gdgfsdfa=",
"scope": "base"
}
若请求错误,服务器将返回一段JSON文本,包含以下参数:
-
error:错误码。
-
error_description:错误描述信息。
示例如下:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "1102",
"error_description": " The request is missing a required parameter"
}
Access Token有效期默认为3600秒,当Access Token过期后,需要使用Refresh Token去获取新的AccessToken。Refresh Token获取AccessToken请参见步骤5。
5. 调用服务端Refresh Token获取Access Token接口,重新获取Access Token。
当AccessToken过期后,需要调用该接口获取新的AccessToken。RefreshToken的有效期为半年。如果Refresh Token失效,则执行步骤3重新进行授权登录流程。
快应用客户端调用fetch.fetch接口发送请求(使用POST方式)到华为OAuth2.0授权服务的“https://login.cloud.huawei.com/oauth2/v2/token”地址上,并带上以下参数:
-
grant_type:必选参数,固定为“refresh_token”。
-
refresh_token:必选参数,用于刷新Access Token用的Refresh Token。
-
client_id:必选参数,在华为开发者联盟创建应用后获取的APP ID。
-
client_secret:必选参数,在华为开发者联盟创建应用后获取的APP SECRET。
示例代码如下:
Postjson2: function () {
var str ='{"grant_type":"refresh_token","refresh_token":"2O9BSX675FGAJYK92KKGG","client_id":"12345","client_secret":"bKaZ0VE3EYrXaXCdCe3d2k9few"}'
fetch.fetch({
url: 'https://login.cloud.huawei.com/oauth2/v2/token',
data: JSON.parse(str),
header: {'User-Agent': 'Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; STF-AL00 Build/HUAWEISTF-AL00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.9 Mobile Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,en-US;q=0.8,en;q=0.6', 'Content-Type':'application/x-www-form-urlencoded'},
responseType: 'json',
method: 'POST',
success: function (ret) {
console.log(JSON.stringify(ret.data))
prompt.showToast({
message: 'success'
})
},
fail: function (msg, code) {
console.log(msg, code)
},
complete: function () {
console.log('complete')
}
})
}
若参数无误,服务器将返回一段JSON文本,主要包含以下参数:
-
access_token:要获取的Access Token(如果包含\,必须去除所有的\)。
-
expires_in:Access Token的有效期,以秒为单位。
-
refresh_token:用于刷新Access Token的Refresh Token,并不是所有应用都会返回该参数(有效期为6个月)。
-
scope:用户实际授予的权限列表。
示例如下:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "346346sdxcdfsa3566546dfdfgfg=",
"expires_in": 3600,
"refresh_token": "68dieddfg08349786gdgfsdfa=",
"scope": "email",
}
若请求错误,服务器将返回一段JSON文本,包含以下参数:
-
error:错误码。
-
error_description:错误描述信息。
示例如下:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "1102",
"error_description": "The request is missing a required parameter "
}
6. 通过Access Token调用account.getPhoneNumber获取用户手机号码信息。
getPhoneNumber(){
account.getPhoneNumber({
appid: "101373095",
token: data.accessToken, //通过code转换AT接口获取的token
encrypt: "true",
success: function(data){
console.log("getPhoneNumber get mobile number success, number="+data.phoneNumber);
prompt.showToast({
message: 'phonenumber: '+data.phoneNumber
})
},
fail: function(data,code){
console.log("getPhoneNumber get mobile number fail, code="+code);
prompt.showToast({
message: data+"fail code: "+code
})
}
})
}
FAQ
Q:接入帐号服务时出现异常,如何处理?
华为帐号接口为厂商定制接口,为了方便定位问题,调试时,请安装华为快应用IDE进行调试。出现异常请参考如下操作进行定位:
1. 检查是否已在“华为开发者联盟”申请华为帐号服务。详细内容请参见官方文档:开通帐号服务。
2. 调用account.getProvider,请确保获取返回值为huawei后,再调用其他接口。华为帐号相关接口请参见官方文档:API> 华为服务 > 帐号。
3. 如果出现1002的错误码,请检查使用IDE生成的签名信息和“华为开发者联盟”上配置的证书指纹是否保持一致。如果使用“构建 > 构建快应用”调试快应用,请将IDE工程sign目录下release文件夹中的正式证书文件,拷贝到debug文件夹中。
4. 出现其他错误码,请参考华为帐号“通用错误码”中“HMSSDK框架错误码”部分的错误码进行处理。