智能客服
你问我答,随时在线为你解决问题

























使用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以空格分隔。
|
- POST /oauth2/v3/token HTTP/1.1
- Host: oauth-login.cloud.huawei.com
- Content-Type: application/x-www-form-urlencoded
-
- 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描述。 |
调用失败时,响应消息体返回如下:
请求成功时:
- HTTP/1.1 200 OK
- Content-Type: application/json;charset=UTF-8
-
- {
- "access_token": "<Access Token>",
- "id_token": "<ID Token>",
- "expires_in": 3600,
- "scope": "openid profile email",
- "token_type": "Bearer"
- }
请求失败时:
- HTTP/1.1 400 Bad Request
- Content-Type: application/json;charset=UTF-8
-
- {
- "sub_error": 12304,
- "error_description": "invalid client_secret",
- "error": 1101
- }
Java代码示例如下,运行前需要进行调用示例环境配置:
- import org.apache.http.NameValuePair;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.message.BasicNameValuePair;
- import org.huawei.uniaccount.util.CallUtils;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Objects;
- public class RefreshTokenAPIDemo {
- public static void main(String[] args) throws IOException {
- // 刷新凭证接口URL
- String url = "https://oauth-login.cloud.huawei.com/oauth2/v3/token";
- // 授权模式,固定传"refresh_token"
- String grant_type = "refresh_token";
- // 替换为您的Client ID
- String client_id = "1014*****";
- // 替换为您Client ID对应的Client Secret
- String client_secret = "14275e4b570993*****";
- // 替换为您Client ID获取的Refresh Token
- String refresh_token = "DQECANKi******1QzQpZGknGJ5h******dph2zTnq9PQj******lXZUpDy4Q";
- Map<String, Object> tokenInfo = refreshToken(url, refresh_token, client_secret, client_id, grant_type);
- // 解析获取响应参数列表,例:解析获取access_token
- String accessToken = (String) tokenInfo.get("access_token");
- }
- private static Map<String, Object> refreshToken(String url, String refresh_token, String client_secret,
- String client_id, String grant_type) throws IOException {
- HttpPost httpPost = new HttpPost(url);
- List<NameValuePair> request = new ArrayList<>();
- request.add(new BasicNameValuePair("refresh_token", refresh_token));
- request.add(new BasicNameValuePair("client_secret", client_secret));
- request.add(new BasicNameValuePair("client_id", client_id));
- request.add(new BasicNameValuePair("grant_type", grant_type));
- httpPost.setEntity(new UrlEncodedFormEntity(request));
- return CallUtils.toJsonObject(CallUtils.remoteCall(httpPost, (response, responseBody) -> {
- int statusCode = response.getStatusLine().getStatusCode();
- // http状态码为200,请求成功,
- if (statusCode == 200) {
- return null;
- }
- // http状态码非200,解析响应的body,业务视情况进行处理
- Map<String, Object> errorResponseBody = CallUtils.toJsonObject(responseBody);
- // 业务响应主错误码
- Object error = errorResponseBody.get("error");
- // 业务响应子错误码
- Object sub_error = errorResponseBody.get("sub_error");
- // 业务可根据返回的主+子错误码进行自己的业务处理;例:错误码不为空,抛出异常
- if (Objects.nonNull(error) && Objects.nonNull(sub_error)) {
- return new IOException("call " + url + " failed! http status code: " + statusCode + ", response data: " + responseBody);
- }
- return null;
- }));
- }
- }
业务响应主错误码 | 业务响应子错误码 | 描述 | 解决方法 |
|---|---|---|---|
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在线调试此接口。
智能客服
你问我答,随时在线为你解决问题
合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
解决方案
精准高效的一站式服务支持,助力开发者商业成功