文档管理中心

此版本文档已归档不再维护,推荐您使用最新版本

指南公共开放平台调用说明基于OAuth2.0开放鉴权

开放平台鉴权

1. 概述

开放平台采用OAuth2.0协议作为第三方应用提供用户接入服务。OAuth2.0是一个开放授权协议,它可以使第三方应用在不获取用户的用户名和密码的前提下,访问用户授权的资源。OAuth2.0协议规范,可访问OAuth 2.0官方网站

2. 流程

2.1 获取APP ID

创建并管理应用,获取产品的APP ID(下文中提及的client_id值传此处APP ID值)和APP SECRET(下文中提及的client_secret值传此处APP SECRET值)。

2.2 用户授权

  1. 客户端应用向华为OAuth2.0服务发起一个授权请求。

  2. 华为OAuth2.0服务向用户展示一个授权页面,提醒用户客户端应用需要获取用户的哪些信息。

  3. 用户授权客户端应用后,客户端应用可获得一个authorization_code。

2.3 获取Access Token

客户端应用向华为OAuth2.0服务发起获取Access Token的请求。

2.4 访问数据

获取到access_token后,客户端应用可以通过华为Open Api访问用户授权的数据。

3. Access Token 获取方式

注意:
目前access_token的有效期通过返回的expires_in来传达,access_token的有效时间可能会在未来有调整。access_token在有效期内尽量复用,业务要根据这个有效时间提前去申请新access_token即可。如果业务频繁申请access_token,可能会被流控(当前应用级access_token流控阈值为1000次/5分钟,详情参考华为OAuth流控机制)。业务在API调用获知access_token已超时的情况下(NSP_STATUS=6, 错误与异常机制 ),可以触发access_token的申请流程。对于授权码模式,重新获取access_token,优先使用refresh_token(见第4节)。

3.1 授权码模式

第一步:先获取用户的授权,生成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。

3.1.1 authorize请求

参数可选/必选说明
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”。

示例:

收起
自动换行
深色代码主题
复制
  1. 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

3.1.2 authorize响应

参数说明
authorization_code授权码
state与调用oauth2/v2/authorize接口时传入的state值完全一致。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 302 Found
  2. Location:
  3. https://www.example.com/oauth_redirectauthorization_code=CFwbd205%2B%2FPzudRlhvPW2E6NImLzsI77qX8rAPAfd7VF8jlEQqTqRQiZfQ2JQuFvgHMw2TIFT9zKTGw1X7V%2FDCYTPx5IqoVoek2YbNXbXb4kIR1oHIRfOpSQKHEAd5LoKsTlkcZrwTY3JgsJb5EfKEeVvfjjxkqbe%2B0dtfL%2F557cuS9wOeau%2BXpqvJn4zScY8mF5dD31fhs%2FAHiW%2Bg%2BX6r8N2WWUyn1wDOD6sKng9XZfukliGa21TFlXNRcliBO4v6fe3hvEgGCATMQsXvW2md5rJzZ4Wg%3D%3D&state=xjps23d

3.1.2.1 错误响应

主错误码子错误码错误码含义建议业务方处理方式
110220001client_id为空业务方的回调端点不会收到请求。可以在浏览器中看到错误码。需根据错误码定位入参的错误。
110120002client_id格式不对
110120003client_id在系统中不存在
110220011response_type为空
110120012response_type格式不对
110220021redirect_uri为空
110120022redirect_uri格式不对
110120023redirect_uri与联盟注册的回调地址不一致,也不在oauth配置的白名单中。
110120031state格式不对业务方的回调端点会收到请求,请求后面拼接了错误码。需根据错误码定位入参的错误。
110120041scope格式不对
110120042scope在系统不存在
110120051access_type格式不对
110120061lang格式不对
110120071display格式不对
1203其他错误码其他错误,包括内部组件之间网络不通等错误。遇到其他错误码,请联系支撑人员进行定位。

示例:

如果client_id和redirect_uri校验通过了,则会进行302跳转,在redirect_uri后面拼接错误码。

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 302 Found
  2. Location:
  3. https://www.example.com/?error=1101&error_description=The+request+is+invalid&sub_error=20041

如果client_id和redirect_uri校验不通过,则返回的httpStatus为400,body为一段json。

收起
自动换行
深色代码主题
复制
  1. {"error":1101,"sub_error":20023,"error_description":"The request is invalid"}

3.1.3 code换token请求

字段必选/可选类型描述
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必选stringclient_id的密码,在开发者联盟上查看。
redirect_uri必选string必须和调用/oauth2/v2/authorize接口时传递的redirect_uri参数完全一致。

示例:

收起
自动换行
深色代码主题
复制
  1. POST /oauth2/v2/token HTTP/1.1
  2. Host: oauth-login.cloud.huawei.com
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=authorization_code&code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn&client_id=12345&client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth_redirect

3.1.4 code换token响应

字段类型描述
access_tokenstring

Access Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。

如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。

expires_instringAccess Token的有效期,以秒为单位。
refresh_tokenstring用于刷新Access Token 的 Refresh Token,有效期较长(半年,以服务侧实际配置为准,可能会调整)。需要在调用/oauth2/v2/authorize接口获取code时传递参数access_type=offline才会返回refresh_token。
scopestringAccess Token最终的访问范围,即用户实际授予的权限列表。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 200 OK
  2. Content-Type: text/html;charset=UTF-8
  3. {
  4.    "access_token": "CFyJ21sNODl16eV9y2vu3CwQk9DBr32BkOcxxgAd7MZUR5th1giyTk5\/kA+QDAyxou+\/5U2zzBRcf3qgLkkFdtbbC+m
  5.    M3zFV7xj7CCEMHc5Tw92al0Y=",
  6.    "expires_in": 3600,
  7.    "refresh_token": "CF13G0sRaGybtYt7SIyeUILNORtTFwMgz4ao5C7j7vtgLPt6ogmXKjdI8RS\/YlyS71z4DyP6kEMnOrRlmNK0KhdOUNW
  8.    d+qVLLRsEEHkqRIKpuAkPvL8=",
  9.    "scope": "https:\/\/www.huawei.com\/auth\/account\/base.profile",
  10.    "token_type": "Bearer"
  11. }

3.1.4.1 错误响应

主错误码子错误码错误码含义建议业务方处理方式
110220001client_id为空这些情况是入参不对,需要检查参数的配置。
110120002client_id格式不对
110220171client_secret为空
110120172client_secret格式不对
110220181grant_type为空
110120182grant_type值不对
120312303client_id在系统不存在
120312304client_secret不对
110220151code为空
110120152code格式不对
110220021redirect_uri为空
110120022redirect_uri格式不对
110320153code解不开
110120154code中的client_id和入参不一致
110120024code中的redirect_uri和入参不一致
110120155code过期需要重新获取code
110120156code已经被使用过
1203其他错误码

其他错误,包括内部组件之间网络不通等错误。

(1)建议进行重试调用,可能会成功。

(2)除了上面的子错误码,其他子错误码都算到这个分支里。

(3)建议把子错误码打印出来,有助于定位问题。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 400 Bad Request
  2. Content-Type: text/html;charset=UTF-8
  3. {"error":1101,"sub_error":20023,"error_description":"The request is invalid"}

3.2 客户端密码模式

即通过应用的密钥获取Access Token,适用于任何类型应用。

注意:
通过此方式获取的access_token,仅可以访问与用户无关的Open API。


客户端密码模式下,不需要用户授权。客户端后台直接发一个请求给华为OAuth2.0服务即可。请求地址如下:

https://oauth-login.cloud.huawei.com/oauth2/v2/token

3.2.1 token请求

字段必选/可选类型描述
grant_type必选string固定填”client_credentials”
client_id必选int创建应用时获得的App ID。
client_secret必选stringAppid的密码,在开发者联盟上查。

示例:

收起
自动换行
深色代码主题
复制
  1. POST /oauth2/v2/token HTTP/1.1
  2. Host: oauth-login.cloud.huawei.com
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=client_credentials&client_id=12345&client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few

3.2.2 响应格式

字段类型描述
access_tokenstringAccess Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。

如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。

expires_inintAccess Token的有效期,以秒为单位。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 200 OK
  2. Content-Type: text/html;charset=UTF-8
  3. {"access_token":"CFyJ7eTl8WIPi9603E7Ro9Icy+K0JYe2qVjS8uzwCPltlO0fC7mZ0gzZX9p8CCwAaiU17nyP+N8+ORRzjjk1EA==","expires_in":3600,"token_type":"Bearer"}

3.2.2.1 错误响应

主错误码子错误码错误码含义建议业务方处理方式
110220001client_id为空如果报错,需要检查参数配置。
110120002client_id格式不对
110220171client_secret为空
110120172client_secret格式不对
110220181grant_type为空
110120182grant_type值不对
120312303client_id在系统不存在
120312304client_secret不对
110120173client_secret不是正确密码
1203其他错误码其他错误,包括内部组件之间网络不通等错误。

(1)建议进行重试调用,可能会成功。

(2)除了上面的子错误码,其他子错误码都算到这个分支里。

(3)建议把子错误码打印出来,有助于定位问题。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 400 Bad Request
  2. Content-Type: text/html;charset=UTF-8
  3. {"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的调用。

4. 刷新token接口

请求地址:https://oauth-login.cloud.huawei.com/oauth2/v2/token

4.1 刷新token请求

字段必选/可选类型描述
grant_type必选string该值固定填refresh_token
refresh_token必选string在授权码模式下获取到refresh_token
client_id必选int必须和调用/oauth2/v2/authorize接口时传递的client_id一样
client_secret必选stringAppid的密码,在开发者联盟上查看。

示例:(仅示范格式,需改为合法的参数值)

收起
自动换行
深色代码主题
复制
  1. POST /oauth2/v2/token HTTP/1.1
  2. Host: oauth-login.cloud.huawei.com
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=refresh_token&client_id=12345&client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few&refresh_token=CF2Mm03n0aos9iZZ8nIhfyDtoXy74CXeBi50gVVhMpB0IUzlv9ZwizEvTBhVoF820ZPim0JwNR9j2p1qgEQWnIVYZRlp4T6ezMgekUnsHBkvNev5rd2MdfQMLP

4.2 刷新token响应

字段类型描述
access_token
stringAccess Token。用curl命令或者postman等工具手工获取access_token的时候,需要注意json字符串中是存在转义符的。把“\/”还原为“/”才是正确的access_token,否则在使用access_token的过程中会报access_token非法。

如果是写代码,采用任意的第三方库,都能正确解析json串,获取到正确的值。

expires_inintAccess Token的有效期,以秒为单位。
refresh_tokenstring

用于刷新Access Token 的 Refresh Token,有效期半年(OAuth可能会调整这个配置)。

如果在服务器配置了返回RT,则服务器一定会返回该字段。返回的值可能是一个新的refresh_token,新的refresh_token的有效期仍为半年;也可能和入参的refresh_token一样。

scopestringAccess Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限)。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 200 OK
  2. Content-Type: text/html;charset=UTF-8
  3. {"access_token":"CFyfW\/LhbSmXglCBtzRGbHaHMsnpVfS1ny+AQes6jiY4ZV+TQjxf7DvXS0ywDuwWaiK0CUka3AWUpCHL01dikfKGalCNjS7PZWzolrIFInhHUm7Lzt0IYeiU3QSZHmWf","expires_in":3600,"scope":"
  4. https:\/\/www.huawei.com\/auth\/account\/accountlist
  5. https:\/\/www.huawei.com\/auth\/account\/mobile.number
  6. https:\/\/www.huawei.com\/auth\/account
  7. https:\/\/smarthome.com\/auth\/smarthome\/devices
  8. https:\/\/smarthome.com\/auth\/smarthome\/skill
  9. https:\/\/www.huawei.com\/auth\/account\/base.profile","token_type":"Bearer"}

4.2.1 错误响应

主错误码子错误码错误码含义调用方处理方式(建议)
110220001client_id为空

(1)建议只识别子错误码,逻辑会简单点。主错误码是为了和老版本兼容

(2)这些子错误码属于参数错误,不要重试调用,重试了也不会成功。

(3)参数错误一般在调试阶段或者上线初期出现。若遇到,建议业务方排查代码或配置项,不要轻易将客户端登录态踢下线

110120002client_id格式不对
110220171client_secret为空
110120172client_secret格式不对
110220181grant_type为空
110120182grant_type值不对
120312303client_id在系统不存在
120312304client_secret不对
110220191refresh_token为空
110120192refresh_token格式不对
110120154refresh_token中的client_id和入参不一致
120331218refresh_token不满足正则表达式
120331202refresh_token解不开。RT满足了正则表达式校验,但是实际无法被解析。举例:原RT被截断了或者被编码转换了。
120311205refresh_token过期只有这两个子错误码,客户端需要重新请求/oauth2/v2/authorize接口,触发用户重新授权。
120331204refresh_token在黑名单中(用户修改密码或者登出操作,会使之前的refresh_token被加入黑名单)。
1203其他错误码其他错误,包括内部组件之间网络不通等错误。

(1)建议进行重试调用,可能会成功。

(2)除了上面的子错误码,其他子错误码都算到这个分支里。

(3)建议把子错误码打印出来,有助于定位问题。

示例:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 400 Bad Request
  2. Content-Type: text/html;charset=UTF-8
  3. {"error":1203,"sub_error":31204,"error_description":"unknown error"}
本页面可能包含由第三方许可的内容,请参考具体描述
在 概览 中进行搜索
请输入您想要搜索的关键词