文档管理中心
您当前浏览的HarmonyOS 5.0.1(API 13)文档归档不再维护,推荐您使用最新版本。详细请参考文档维护策略变更

刷新凭证

功能介绍

使用Refresh Token来获取新的Access Token。

场景描述

当Access Token即将过期或已经过期时,使用Refresh Token获取新的Access Token。

使用约束

Refresh Token有效期为180天。

接口原型

承载协议

HTTPS POST

接口方向

开发者服务器->华为账号服务器

接口URL

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

数据格式

请求消息:Content-Type: application/x-www-form-urlencoded

响应消息:Content-Type: application/json;charset=UTF-8

请求参数

Request Header

展开

参数

是否必选

参数类型

描述

Content-Type

String

取值为:application/x-www-form-urlencoded。

Request Body

展开

参数

是否必选

参数类型

描述

grant_type

String

授权模式,固定传“refresh_token”。

client_id

String

在创建应用后,由华为开发者联盟为应用分配的唯一标识。应用OAuth 2.0客户端ID(凭据)-Client ID的查询方法,请参见查看应用基本信息

client_secret

String

在创建应用后,由华为开发者联盟为应用分配的公钥(Client Secret)。应用OAuth 2.0客户端ID(凭据)-Client Secret的查询方法,请参见查看应用基本信息

refresh_token

String

通过获取用户级凭证获取的Refresh Token,用于刷新Access Token。

scope

String

该参数用于指定获取Access Token中的scope范围,需要是Refresh Token中包含的scope的子集,多个scope以空格分隔。

  • 如果没有传scope参数,则生成的Access Token包含的scope和Refresh Token中的scope相同。
  • 如果传了scope参数,则Access Token所包含的scope是Refresh Token中的scope和入参scope取交集。
  • 如果需要让生成的AT中不包含任何scope,需要让scope参数的值为“NO_SCOPE”。

请求示例

收起
自动换行
深色代码主题
复制
  1. POST /oauth2/v3/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=
    <client_id>
    &client_secret=
    <client_secret>
    &refresh_token=
    <refresh_token>

响应参数

Response Header

展开

参数

是否必选

参数类型

描述

Content-Type

String

取值为:application/json;charset=UTF-8。

Response Body

调用成功时,响应消息体返回如下:

展开

参数

是否必选

参数类型

描述

token_type

String

固定字符串“Bearer”。

access_token

String

Access Token,访问被权限管控资源的凭证。

scope

String

Access Token中的scope,grant_type为“client_credentials“不返回。

expires_in

Long

Access Token的过期时间,以秒为单位。有效期为3600秒。

id_token

String

获取code时,包含openid权限,则会返回此参数(JWT格式)。ID Token的描述信息请参见验证ID Token有效性中ID Token描述。

调用失败时,响应消息体返回如下:

展开

参数

参数类型

描述

error

int

业务响应主错误码,详见错误码

sub_error

int

业务响应子错误码,详见错误码

error_description

String

错误描述信息。

响应示例

请求成功时:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. {
  4. "access_token": "
    <Access Token>
    ",
  5. "id_token": "
    <ID Token>
    ",
  6. "expires_in": 3600,
  7. "scope": "openid profile email",
  8. "token_type": "Bearer"
  9. }

请求失败时:

收起
自动换行
深色代码主题
复制
  1. HTTP/1.1 400 Bad Request
  2. Content-Type: application/json;charset=UTF-8
  3. {
  4. "sub_error": 12304,
  5. "error_description": "invalid client_secret",
  6. "error": 1101
  7. }

调用示例

Java代码示例如下,运行前需要进行调用示例环境配置

收起
自动换行
深色代码主题
复制
  1. import org.apache.http.NameValuePair;
  2. import org.apache.http.client.entity.UrlEncodedFormEntity;
  3. import org.apache.http.client.methods.HttpPost;
  4. import org.apache.http.message.BasicNameValuePair;
  5. import org.huawei.uniaccount.util.CallUtils;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Objects;
  11. public class RefreshTokenAPIDemo {
  12. public static void main(String[] args) throws IOException {
  13. // 刷新凭证接口URL
  14. String url = "https://oauth-login.cloud.huawei.com/oauth2/v3/token";
  15. // 授权模式,固定传"refresh_token"
  16. String grant_type = "refresh_token";
  17. // 替换为您的Client ID
  18. String client_id = "1014*****";
  19. // 替换为您Client ID对应的Client Secret
  20. String client_secret = "14275e4b570993*****";
  21. // 替换为您Client ID获取的Refresh Token
  22. String refresh_token = "DQECANKi******1QzQpZGknGJ5h******dph2zTnq9PQj******lXZUpDy4Q";
  23. Map<String, Object> tokenInfo = refreshToken(url, refresh_token, client_secret, client_id, grant_type);
  24. // 解析获取响应参数列表,例:解析获取access_token
  25. String accessToken = (String) tokenInfo.get("access_token");
  26. }
  27. private static Map<String, Object> refreshToken(String url, String refresh_token, String client_secret,
  28. String client_id, String grant_type) throws IOException {
  29. HttpPost httpPost = new HttpPost(url);
  30. List<NameValuePair> request = new ArrayList<>();
  31. request.add(new BasicNameValuePair("refresh_token", refresh_token));
  32. request.add(new BasicNameValuePair("client_secret", client_secret));
  33. request.add(new BasicNameValuePair("client_id", client_id));
  34. request.add(new BasicNameValuePair("grant_type", grant_type));
  35. httpPost.setEntity(new UrlEncodedFormEntity(request));
  36. return CallUtils.toJsonObject(CallUtils.remoteCall(httpPost, (response, responseBody) -> {
  37. int statusCode = response.getStatusLine().getStatusCode();
  38. // http状态码为200,请求成功,
  39. if (statusCode == 200) {
  40. return null;
  41. }
  42. // http状态码非200,解析响应的body,业务视情况进行处理
  43. Map<String, Object> errorResponseBody = CallUtils.toJsonObject(responseBody);
  44. // 业务响应主错误码
  45. Object error = errorResponseBody.get("error");
  46. // 业务响应子错误码
  47. Object sub_error = errorResponseBody.get("sub_error");
  48. // 业务可根据返回的主+子错误码进行自己的业务处理;例:错误码不为空,抛出异常
  49. if (Objects.nonNull(error) && Objects.nonNull(sub_error)) {
  50. return new IOException("call " + url + " failed! http status code: " + statusCode + ", response data: " + responseBody);
  51. }
  52. return null;
  53. }));
  54. }
  55. }

错误码

展开

HTTP响应码

描述

解决方法

200

成功。

-

400

参数错误。

请根据业务响应主错误码以及业务响应子错误码进一步排查问题。

404

找不到服务。

请检查请求URI是否正确。

500

服务内部错误。

请通过在线提单提交问题。

502

请求连接异常,常见于网络状况不稳定。

建议稍后重试,或通过在线提单提交问题。

展开

业务响应主错误码

业务响应子错误码

描述

解决方法

1101

12304

client_secret不正确。

请前往开发者联盟/AGC确认client_secret是否正确。

20002

client_id格式不正确。

检查client_id是否满足正则:^[0-9]{1,64}$。

20003

client_id在系统不存在。

请前往开发者联盟/AGC确认client_id是否存在。

20154

refresh_token中的client_id和入参不一致。

检查获取refresh_token流程时的client_id与当前流程中的入参client_id是否一致。

20171

client_secret为空。

请按照接口参数的要求,传入正确的client_secret参数。

20172

client_secret格式不正确。

检查client_secret格式是否满足正则:^[0-9a-zA-Z=/\\+]+$。

20182

grant_type值不正确。

grant_type可选值如下:

20192

refresh_token格式不正确。

refresh_token格式需要满足正则:^[0-9a-zA-Z=/\\+]+$。

1102

20001

client_id为空。

请按照接口参数的要求,传入正确的client_id参数。

20181

grant_type为空。

grant_type可选值如下:

20191

refresh_token为空。

请按照接口参数的要求,传入正确的refresh_token参数。

1203

11205

refresh_token过期。

需要重新获取refresh_token。

12303

client_id在系统不存在。

请前往开发者联盟/AGC确认client_id是否存在。

31204

token已失效。

需要重新获取Refresh Token。

31218

token非法。

token格式需要满足正则:^[0-9a-zA-Z=\/\+]+$。

Postman调试

您可以使用Postman在线调试此接口。

在 API参考 中进行搜索
请输入您想要搜索的关键词