账号介绍

华为帐号是用户访问华为云业务的凭证,拥有华为帐号的用户,可以使用华为云业务,如华为云服务、华为游戏中心、华为应用市场等。

华为帐号的开放基于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等。

手把手教你接入快应用账号开发-客户端方式_华为快应用_02

如下以获取用户手机号信息为例进行介绍。

简化模式

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框架错误码”部分的错误码进行处理。