Skip to main content

接口鉴权相关流程

  1. 发起https调用时请务必确认在Http header中包含“Accept-Encoding”,内容填写gzip, deflate。部分框架会自动添加,如果框架不支持,请手动添加。因为有些接口的返回数据很多,如果不开启压缩一次请求返回2M以上的数据,会占用大量带宽。开启Accept-Encoding之后可以压缩到200K。

  2. 华住使用https方式对外提供服务,调用业务接口前必须先拿到Token,Token有效期为3600秒,失效后需要重新申请,申请新Token将会使旧Token失效。建议将获取到的token放缓存,设置成58分钟失效,有效期内可以重复使用。

  3. 调用业务接口返回的错误码为504时,表示缓存已经失效,请重新获取。

  4. 获取token的代码请注意多线程保护,如果多线程同时发起获取token,获取新token就会导致旧的失效,导致线程冲突。

参数名参数类型描述是否必填备注
AuthorizationString请求头将clientId:secret进行Base64编码。编码结果前加上“Basic ”。范例:Basic XXXXXXXXXXXXXXX

测试环境使用的clientId和secret:

用Postman请求方式如下:

Postman请求示例1

  • 出参说明:

    参数名参数类型备注
    Access_tokenStringToken
    token_typeStringToken类型
    expires_inint有效时间,单位秒
    scopeString
  • 出参示例:

    {
    "access_token":"4262327a-58c8-41a3-9fcd-53383912197a",
    "token_type":"Bearer",
    "expires_in":3600,
    "scope":"ALL"
    }

后继调用业务接口都需要将接收到的access_token填入http header中。

Key填“Authorization”,value填“Bearer token”。

使用Postman方法如下:

Postman请求示例2

Java Demo

本demo基于jdk1.8的开发环境

import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Base64;

public class TestToken {

public static void main(String[] args) {
String getTokenUrl = "https://oauth2-api.huazhu.com/oauth/token?scope=ALL&grant_type=client_credentials";
String resutl = doPost(getTokenUrl,"3b670fe2-fc96-470a-b6a7-ffee3163edc3","9871c6394c1f5d7c42b56789cb709d05ac18bc32c8c8621a333a201047fdb0f4c309684599b7fa4ca60fd9874314c2a9f798e0baefc85db40207bad0af3ba45d");
System.out.println(resutl);
}

/**
*
* @param httpUrl 请求token链接
* @param clientId 客户端id
* @param secret 秘钥
* @return
*/
public static String doPost(String httpUrl,String clientId,String secret) {
StringBuffer result = new StringBuffer();
HttpURLConnection connection = null;
OutputStream os = null;
InputStream is = null;
BufferedReader br = null;
try {
URL url = new URL(httpUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(3000);
connection.setReadTimeout(3000);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
//设置请求头签名 注意Basic后面有空格
String sign = StringUtils.join("Basic ",Base64.getEncoder().encodeToString(String.format("%s:%s", clientId,secret).getBytes("utf-8")));
connection.setRequestProperty("Authorization",sign);
//读取响应
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
if (null != is) {
br = new BufferedReader(new InputStreamReader(is, "GBK"));
String temp = null;
while (null != (temp = br.readLine())) {
result.append(temp);
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭连接
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭连接
connection.disconnect();
}
return result.toString();
}
}