智能客服
你问我答,随时在线为你解决问题
此版本文档已归档不再维护,推荐您使用最新版本。
开放平台采用OAuth2.0协议作为第三方应用提供用户接入服务。OAuth2.0是一个开放授权协议,它可以使第三方应用在不获取用户的用户名和密码的前提下,访问用户授权的资源。OAuth2.0协议规范,可访问OAuth 2.0官方网站。
创建并管理应用,获取产品的APP ID(下文中提及的client_id值传此处APP ID值)和APP SECRET(下文中提及的client_secret值传此处APP SECRET值)。
客户端应用向华为OAuth2.0服务发起一个授权请求。
华为OAuth2.0服务向用户展示一个授权页面,提醒用户客户端应用需要获取用户的哪些信息。
用户授权客户端应用后,客户端应用可获得一个authorization_code。
客户端应用向华为OAuth2.0服务发起获取Access Token的请求。
获取到access_token后,客户端应用可以通过华为Open Api访问用户授权的数据。
第一步:先获取用户的授权,生成authorization_code。
第二步:客户端携带authorization_code向华为OAuth2.0申请Access Token。

这种方式有两个请求需要客户端发起:
(1)https://oauth-login.cloud.huawei.com/oauth2/v2/authorize
这个请求需要在浏览器发起,最终会生成一个authorization_code,通过浏览器302跳转方式发送给客户端的后台接口(redirect_uri)。
(2)https://oauth-login.cloud.huawei.com/oauth2/v2/token
这个请求需要在后台发起。客户端的后台接口(redirect_uri)接收到authorization_code后,调用该接口来获取access_token。
| 参数 | 可选/必选 | 说明 |
| client_id | 必选 | 在开发者联盟注册应用时获得的App ID |
| response_type | 必选 | 此时必须填”code”。 |
| redirect_uri | 必选 | 授权后要回调的URI,即接收Authorization Code的URI。必须跟在开发者联盟上注册的回调地址保持一致,允许在后面加参数。 比如:联盟注册的是回调是https://www.example.com,允许redirect_uri=https%3A%2F%2Fwww.example.com%3Fsomearg%3Dxxx。(http://www.example.com?somearg=xxx)。 注意: 在后面调用oauth2/v2/token接口的时候,必须传递一样的redirect_uri。 |
| scope | 可选 | Access Token的访问范围,即用户实际授予的权限列表。 |
| state | 可选 | 用于保持请求和回调的状态,授权服务器在回调时(重定向用户浏览器到“redirect_uri”时),会在Query Parameter中原样回传该参数。OAuth2.0标准协议建议,利用state参数来防止CSRF攻击。 |
| access_type | 可选 | 如果需要返回refresh_token,则该值固定填”offline”。 |
| display | 可选 | 登录和授权页面的展现样式,默认为“page”。 如果是端侧,则该值需要填为“mobile”。 |
示例:
- https://oauth-login.cloud.huawei.com/oauth2/v2/authorize?response_type=code&client_id=59395&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth_redirect&access_type=offline&scope=https%3A%2F%2Fwww.huawei.com%2Fauth%2Faccount%2Fbase.profile%20https%3A%2F%2Fwww.huawei.com%2Fauth%2Faccount%2Fmobile.number
| 参数 | 说明 |
| authorization_code | 授权码 |
| state | 与调用oauth2/v2/authorize接口时传入的state值完全一致。 |
示例:
- HTTP/1.1 302 Found
- Location:
- https://www.example.com/oauth_redirectauthorization_code=CFwbd205%2B%2FPzudRlhvPW2E6NImLzsI77qX8rAPAfd7VF8jlEQqTqRQiZfQ2JQuFvgHMw2TIFT9zKTGw1X7V%2FDCYTPx5IqoVoek2YbNXbXb4kIR1oHIRfOpSQKHEAd5LoKsTlkcZrwTY3JgsJb5EfKEeVvfjjxkqbe%2B0dtfL%2F557cuS9wOeau%2BXpqvJn4zScY8mF5dD31fhs%2FAHiW%2Bg%2BX6r8N2WWUyn1wDOD6sKng9XZfukliGa21TFlXNRcliBO4v6fe3hvEgGCATMQsXvW2md5rJzZ4Wg%3D%3D&state=xjps23d
| 主错误码 | 子错误码 | 错误码含义 | 建议业务方处理方式 |
| 1102 | 20001 | client_id为空 | 业务方的回调端点不会收到请求。可以在浏览器中看到错误码。需根据错误码定位入参的错误。 |
| 1101 | 20002 | client_id格式不对 | |
| 1101 | 20003 | client_id在系统中不存在 | |
| 1102 | 20011 | response_type为空 | |
| 1101 | 20012 | response_type格式不对 | |
| 1102 | 20021 | redirect_uri为空 | |
| 1101 | 20022 | redirect_uri格式不对 | |
| 1101 | 20023 | redirect_uri与联盟注册的回调地址不一致,也不在oauth配置的白名单中。 | |
| 1101 | 20031 | state格式不对 | 业务方的回调端点会收到请求,请求后面拼接了错误码。需根据错误码定位入参的错误。 |
| 1101 | 20041 | scope格式不对 | |
| 1101 | 20042 | scope在系统不存在 | |
| 1101 | 20051 | access_type格式不对 | |
| 1101 | 20061 | lang格式不对 | |
| 1101 | 20071 | display格式不对 | |
| 1203 | 其他错误码 | 其他错误,包括内部组件之间网络不通等错误。 | 遇到其他错误码,请联系支撑人员进行定位。 |
示例:
如果client_id和redirect_uri校验通过了,则会进行302跳转,在redirect_uri后面拼接错误码。
- HTTP/1.1 302 Found
- Location:
- https://www.example.com/?error=1101&error_description=The+request+is+invalid&sub_error=20041
如果client_id和redirect_uri校验不通过,则返回的httpStatus为400,body为一段json。
- {"error":1101,"sub_error":20023,"error_description":"The request is invalid"}
| 字段 | 必选/可选 | 类型 | 描述 |
| grant_type | 必选 | string | 固定填authorization_code |
| code | 必选 | string | 通过/oauth2/v2/authorize接口获取到的Authorization Code。注意code是一次性的,且只有5分钟有效期。5分钟之前获取的code或者已经使用过的code,是不能再使用的。 |
| client_id | 必选 | int | 必须和调用/oauth2/v2/authorize接口时传递的client_id一样。 |
| client_secret | 必选 | string | client_id的密码,在开发者联盟上查看。 |
| redirect_uri | 必选 | string | 必须和调用/oauth2/v2/authorize接口时传递的redirect_uri参数完全一致。 |
示例:
- POST /oauth2/v2/token HTTP/1.1
- Host: oauth-login.cloud.huawei.com
- Content-Type: application/x-www-form-urlencoded
- grant_type=authorization_code&code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn&client_id=12345&client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth_redirect
| 字段 | 类型 | 描述 |
| access_token | string | Access Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。 如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。 |
| expires_in | string | Access Token的有效期,以秒为单位。 |
| refresh_token | string | 用于刷新Access Token 的 Refresh Token,有效期较长(半年,以服务侧实际配置为准,可能会调整)。需要在调用/oauth2/v2/authorize接口获取code时传递参数access_type=offline才会返回refresh_token。 |
| scope | string | Access Token最终的访问范围,即用户实际授予的权限列表。 |
示例:
- HTTP/1.1 200 OK
- Content-Type: text/html;charset=UTF-8
- {
- "access_token": "CFyJ21sNODl16eV9y2vu3CwQk9DBr32BkOcxxgAd7MZUR5th1giyTk5\/kA+QDAyxou+\/5U2zzBRcf3qgLkkFdtbbC+m
- M3zFV7xj7CCEMHc5Tw92al0Y=",
- "expires_in": 3600,
- "refresh_token": "CF13G0sRaGybtYt7SIyeUILNORtTFwMgz4ao5C7j7vtgLPt6ogmXKjdI8RS\/YlyS71z4DyP6kEMnOrRlmNK0KhdOUNW
- d+qVLLRsEEHkqRIKpuAkPvL8=",
- "scope": "https:\/\/www.huawei.com\/auth\/account\/base.profile",
- "token_type": "Bearer"
- }
| 主错误码 | 子错误码 | 错误码含义 | 建议业务方处理方式 |
| 1102 | 20001 | client_id为空 | 这些情况是入参不对,需要检查参数的配置。 |
| 1101 | 20002 | client_id格式不对 | |
| 1102 | 20171 | client_secret为空 | |
| 1101 | 20172 | client_secret格式不对 | |
| 1102 | 20181 | grant_type为空 | |
| 1101 | 20182 | grant_type值不对 | |
| 1203 | 12303 | client_id在系统不存在 | |
| 1203 | 12304 | client_secret不对 | |
| 1102 | 20151 | code为空 | |
| 1101 | 20152 | code格式不对 | |
| 1102 | 20021 | redirect_uri为空 | |
| 1101 | 20022 | redirect_uri格式不对 | |
| 1103 | 20153 | code解不开 | |
| 1101 | 20154 | code中的client_id和入参不一致 | |
| 1101 | 20024 | code中的redirect_uri和入参不一致 | |
| 1101 | 20155 | code过期 | 需要重新获取code |
| 1101 | 20156 | code已经被使用过 | |
| 1203 | 其他错误码 | 其他错误,包括内部组件之间网络不通等错误。 | (1)建议进行重试调用,可能会成功。 (2)除了上面的子错误码,其他子错误码都算到这个分支里。 (3)建议把子错误码打印出来,有助于定位问题。 |
示例:
- HTTP/1.1 400 Bad Request
- Content-Type: text/html;charset=UTF-8
- {"error":1101,"sub_error":20023,"error_description":"The request is invalid"}
即通过应用的密钥获取Access Token,适用于任何类型应用。

客户端密码模式下,不需要用户授权。客户端后台直接发一个请求给华为OAuth2.0服务即可。请求地址如下:
https://oauth-login.cloud.huawei.com/oauth2/v2/token
| 字段 | 必选/可选 | 类型 | 描述 |
| grant_type | 必选 | string | 固定填”client_credentials” |
| client_id | 必选 | int | 创建应用时获得的App ID。 |
| client_secret | 必选 | string | Appid的密码,在开发者联盟上查。 |
示例:
- POST /oauth2/v2/token HTTP/1.1
- Host: oauth-login.cloud.huawei.com
- Content-Type: application/x-www-form-urlencoded
- grant_type=client_credentials&client_id=12345&client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few
| 字段 | 类型 | 描述 |
| access_token | string | Access Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。 如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。 |
| expires_in | int | Access Token的有效期,以秒为单位。 |
示例:
- HTTP/1.1 200 OK
- Content-Type: text/html;charset=UTF-8
- {"access_token":"CFyJ7eTl8WIPi9603E7Ro9Icy+K0JYe2qVjS8uzwCPltlO0fC7mZ0gzZX9p8CCwAaiU17nyP+N8+ORRzjjk1EA==","expires_in":3600,"token_type":"Bearer"}
| 主错误码 | 子错误码 | 错误码含义 | 建议业务方处理方式 |
| 1102 | 20001 | client_id为空 | 如果报错,需要检查参数配置。 |
| 1101 | 20002 | client_id格式不对 | |
| 1102 | 20171 | client_secret为空 | |
| 1101 | 20172 | client_secret格式不对 | |
| 1102 | 20181 | grant_type为空 | |
| 1101 | 20182 | grant_type值不对 | |
| 1203 | 12303 | client_id在系统不存在 | |
| 1203 | 12304 | client_secret不对 | |
| 1101 | 20173 | client_secret不是正确密码 | |
| 1203 | 其他错误码 | 其他错误,包括内部组件之间网络不通等错误。 | (1)建议进行重试调用,可能会成功。 (2)除了上面的子错误码,其他子错误码都算到这个分支里。 (3)建议把子错误码打印出来,有助于定位问题。 |
示例:
- HTTP/1.1 400 Bad Request
- Content-Type: text/html;charset=UTF-8
- {"error":1203,"sub_error":12303,"error_description":"The request is invalid"}
在授权码模式中,华为OAuth2.0服务能够返回一个refresh_token。refresh_token有效期远远长于access_token。在access_token即将过期时,应该优先用refresth_token来获取一个新的access_token,而不需要每次都触发前台的页面跳转。如果接口返回的错误码明确为refresh_token已经过期或失效,则重新触发/oauht/v2/authorize的调用。
请求地址:https://oauth-login.cloud.huawei.com/oauth2/v2/token
| 字段 | 必选/可选 | 类型 | 描述 |
| grant_type | 必选 | string | 该值固定填refresh_token |
| refresh_token | 必选 | string | 在授权码模式下获取到refresh_token |
| client_id | 必选 | int | 必须和调用/oauth2/v2/authorize接口时传递的client_id一样 |
| client_secret | 必选 | string | Appid的密码,在开发者联盟上查看。 |
示例:(仅示范格式,需改为合法的参数值)
- POST /oauth2/v2/token HTTP/1.1
- Host: oauth-login.cloud.huawei.com
- Content-Type: application/x-www-form-urlencoded
- grant_type=refresh_token&client_id=12345&client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few&refresh_token=CF2Mm03n0aos9iZZ8nIhfyDtoXy74CXeBi50gVVhMpB0IUzlv9ZwizEvTBhVoF820ZPim0JwNR9j2p1qgEQWnIVYZRlp4T6ezMgekUnsHBkvNev5rd2MdfQMLP
| 字段 | 类型 | 描述 |
| access_token | string | Access Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。 如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。 |
| expires_in | int | Access Token的有效期,以秒为单位。 |
| refresh_token | string | 用于刷新Access Token 的 Refresh Token,有效期半年(OAuth可能会调整这个配置)。 如果在服务器配置了返回RT,则服务器一定会返回该字段。返回的值可能是一个新的refresh_token,新的refresh_token的有效期仍为半年;也可能和入参的refresh_token一样。 |
| scope | string | Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限)。 |
示例:
- HTTP/1.1 200 OK
- Content-Type: text/html;charset=UTF-8
- {"access_token":"CFyfW\/LhbSmXglCBtzRGbHaHMsnpVfS1ny+AQes6jiY4ZV+TQjxf7DvXS0ywDuwWaiK0CUka3AWUpCHL01dikfKGalCNjS7PZWzolrIFInhHUm7Lzt0IYeiU3QSZHmWf","expires_in":3600,"scope":"
- https:\/\/www.huawei.com\/auth\/account\/accountlist
- https:\/\/www.huawei.com\/auth\/account\/mobile.number
- https:\/\/www.huawei.com\/auth\/account
- https:\/\/smarthome.com\/auth\/smarthome\/devices
- https:\/\/smarthome.com\/auth\/smarthome\/skill
- https:\/\/www.huawei.com\/auth\/account\/base.profile","token_type":"Bearer"}
| 主错误码 | 子错误码 | 错误码含义 | 调用方处理方式(建议) |
| 1102 | 20001 | client_id为空 | (1)建议只识别子错误码,逻辑会简单点。主错误码是为了和老版本兼容 (2)这些子错误码属于参数错误,不要重试调用,重试了也不会成功。 (3)参数错误一般在调试阶段或者上线初期出现。若遇到,建议业务方排查代码或配置项,不要轻易将客户端登录态踢下线。 |
| 1101 | 20002 | client_id格式不对 | |
| 1102 | 20171 | client_secret为空 | |
| 1101 | 20172 | client_secret格式不对 | |
| 1102 | 20181 | grant_type为空 | |
| 1101 | 20182 | grant_type值不对 | |
| 1203 | 12303 | client_id在系统不存在 | |
| 1203 | 12304 | client_secret不对 | |
| 1102 | 20191 | refresh_token为空 | |
| 1101 | 20192 | refresh_token格式不对 | |
| 1101 | 20154 | refresh_token中的client_id和入参不一致 | |
| 1203 | 31218 | refresh_token不满足正则表达式 | |
| 1203 | 31202 | refresh_token解不开。RT满足了正则表达式校验,但是实际无法被解析。举例:原RT被截断了或者被编码转换了。 | |
| 1203 | 11205 | refresh_token过期 | 只有这两个子错误码,客户端需要重新请求/oauth2/v2/authorize接口,触发用户重新授权。 |
| 1203 | 31204 | refresh_token在黑名单中(用户修改密码或者登出操作,会使之前的refresh_token被加入黑名单)。 | |
| 1203 | 其他错误码 | 其他错误,包括内部组件之间网络不通等错误。 | (1)建议进行重试调用,可能会成功。 (2)除了上面的子错误码,其他子错误码都算到这个分支里。 (3)建议把子错误码打印出来,有助于定位问题。 |
示例:
- HTTP/1.1 400 Bad Request
- Content-Type: text/html;charset=UTF-8
- {"error":1203,"sub_error":31204,"error_description":"unknown error"}