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

账号介绍

华为账号是用户访问华为云业务的凭证。拥有华为账号的用户可以使用华为云服务、华为游戏中心、华为应用商店等华为云业务。

[En]

Huawei account is the voucher for users to access Huawei cloud business. Users with Huawei account can use Huawei cloud business, such as Huawei Cloud Service, Huawei Game Center, Huawei App Store and so on.

华为帐号的开放基于OAuth2.0协议标准,在获得用户授权后,应用可以获取用户在华为帐号系统的基本信息,如OpenID、AccessToken、用户昵称、头像等。

目前,客户端的账号登录授权主要有两种模式:简化模式和授权码模式。

[En]

At present, there are two main modes of account login authorization on the client: the simplified mode and the authorization code mode.

适用场景
场景一:获取用户手机号码信息

[En]

Scenario 1: get the user’s mobile phone number information

购物快捷应用通过获取用户的手机号码,给出推送到用户手机上的产品的促销通知。

[En]

The shopping fast application gives the promotion notice of the product pushed to the user’s mobile phone by obtaining the user’s mobile phone number.

场景2:获取用户邮箱信息

[En]

Scenario 2: get user mailbox information

阅读类的快速应用通过获取用户的邮箱将热门图书信息发送到用户的邮箱。

[En]

The fast application of reading class sends popular book information to the user’s mailbox by obtaining the user’s mailbox.

场景三: 华为账号与应用内账号统一

快速应用开发者不需要建立自己的账号体系,可以在线上快速开发,直接使用华为账号系统就可以轻松快捷地管理自己的用户。

[En]

Fast application developers do not need to establish their own account system, can quickly develop online, and directly use Huawei account system to easily and quickly manage their own users.

开发准备
确认已在”华为开发者联盟”申请帐号服务。

如果尚未申请,请参考”开通帐号服务”进行申请。

安装华为快应用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等。

手把手教你接入快应用账号开发-客户端方式
以下是以获取用户手机号信息为例。
[En]

The following is to obtain the user’s mobile number information as an example.

简化模式

  1. 在快应用中调用 account.getProvider 接口判断当前设备是否支持华为帐号服务。

调用接口返回 huawei 表示支持,否则表示不支持。后续功能开发和接口调用必须在设备支持帐号服务的前提进行。

console.log(account.getProvider())
  1. 在快应用中调用 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 })
    }
});
  1. 通过 account.getPhoneNumber 获取用户手机号码信息。
getPhoneNumber() {
    account.authorize({
        appid: "101373095",
        type: "token",
        state: "feedbeef",
        scope: "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())
  1. 判断是否需要重新获取Authorization Code。未获取过Authorization Code,或者已获取Authorization Code,但是调用 account.checkUserSession 接口校验无效,则执行步骤3。account.checkUserSession 校验有效,表示当前会话持续有效,则执行步骤4。
account.checkUserSession({
    success: function (data2) {

    },
    fail: function (data, code) {

    }
});
  1. 在快应用中调用 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分钟,并且只能使用一次,再次使用将无效。
  1. 调用华为服务端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。

  1. 调用服务端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:用户实际授予的权限列表。

示例如下:

若参数无误,服务器将返回一段JSON文本,主要包含以下参数:

access_token:要获取的Access Token(如果包含\,必须去除所有的\)。

 expires_in:Access Token的有效期,以秒为单位。

refresh_token:用于刷新Access Token的Refresh Token,并不是所有应用都会返回该参数(有效期为6个月)。

scope:用户实际授予的权限列表。

示例如下:

若请求错误,服务器将返回一段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 "
}
  1. 通过Access Token调用account.getPhoneNumber获取用户手机号码信息。
getPhoneNumber(){
 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: '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框架错误码”部分的错误码进行处理。

Original: https://blog.csdn.net/weixin_44708240/article/details/120235464
Author: 华为开发者论坛
Title: 手把手教你接入快应用账号开发-客户端方式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/512558/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球