此处使用带时间戳的参数加密鉴权方式
身份认证通用
1.1 参数说明
以下为必传参数
序号 | 参数 | 类型 | 说明 |
---|---|---|---|
1 | t | string | 当前时间戳 |
2 | uid | string | 用户id |
3 | sign | string | 用户参数加密字段 |
4 | priority | string | 优先级 |
1.2 返回值说明
序号 | code | message | 说明 |
---|---|---|---|
1 | 2003 | 参数范围错误 | |
2 | 2004 | 用户不存在或者不可用 | UID对应用户异常 |
3 | 1001 | 未知错误 | |
4 | 1002 | 系统异常 | |
5 | 1003 | 接口鉴权失败 | 用户认证失败 |
6 | 1004 | 接口鉴权缺少参数 | 接口必要参数缺失 |
1.3 Java Demo
1.3.1 客户端发送
public class demo{
public String testSendAuth(){
String uid ="4";
String password = "somekey";
try {
Map<String, Object> parmMap = new HashMap<>();
parmMap.put("biz", "测试业务");
parmMap.put("prod", "测试产品");
parmMap.put("fileid", "randomfileid1");
parmMap.put("priority", "0");
parmMap.put("t", String.valueOf(System.currentTimeMillis()));
String uploadSign = getSignature(uid, password, parmMap);
parmMap.put("uid", uid);
parmMap.put("sign", uploadSign);
StopWatch clock = new StopWatch("发送");
clock.start("postfile");
String result = HttpUtil.post("http://127.0.0.1:8080/web/test/auth", parmMap);
clock.stop();
return result;
}catch (Exception e){
logger.error("",e);
}
return null;
}
public static String getSignature(String uid, String appkey, Map<String, Object> parmMap) {
List<String> keys = new ArrayList<String>(parmMap.keySet());
Collections.sort(keys);
StringBuffer prestr = new StringBuffer(uid);
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
if("uid".equals(key) || "sign".equals(key)){
continue;
}
String value = (String) parmMap.get(key);
prestr.append(key).append("=").append(value);
}
prestr.append(appkey);
String signature = null;
signature = DigestUtils.md5Hex(prestr.toString().getBytes(Charset.forName("utf-8"))).toLowerCase();
return signature;
}
}
1.3.2 服务端接收,鉴权
@PostMapping("auth")
public void authApi(HttpServletRequest request, HttpServletResponse response) throws Exception {
boolean result = authHelper.authValidate(request, response);
if(result){
System.out.println( "success");
}
System.out.println("failed");
}
AuthHelper如下:
@Service("authHelper")
public class AuthHelper {
private static Logger LOG = LoggerFactory.getLogger(AuthHelper.class);
private static final String PARAM_T = "t";
private static final String PARAM_SIGN = "sign";
private static final String PARAM_UID = "uid";
public boolean authValidate(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html;charset=utf-8");
ApiReturnData result = new ApiReturnData();
try {
String authTimespan = request.getParameter("t");
String authSign = request.getParameter("sign");
String uidstr = request.getParameter("uid");
String priority = request.getParameter("priority");
if (StringUtils.isEmpty(authTimespan) || StringUtils.isEmpty(authSign) || StringUtils.isBlank(uidstr)) {
result.setMsg("接口鉴权缺少参数");
result.setCode("1004");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
long uid = 0L;
String authAppkey = "";
try {
uid = Long.parseLong(uidstr);
UserInfo userInfo =toGetUserInfo();
if (null == userInfo || 1 != userInfo.getStatus().intValue()) {
result.setMsg("用户不存在或者不可用");
result.setCode("2004");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
if (AccountTypeEnum.API.getValue() != userInfo.getAccounttype().intValue()) {
result.setMsg("用户类型不正确");
result.setCode("2012");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
authAppkey = userInfo.getAppkey();
} catch (Exception e) {
result.setMsg("用户不存在或者不可用");
result.setCode("2004");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
Map<String, String[]> params = request.getParameterMap();
List<String> keys = new ArrayList<>();
keys.addAll(params.keySet());
Collections.sort(keys);
//主要验签的实现
if (!checkMD5(uidstr, authAppkey, keys, params, authSign)) {
result.setMsg("接口鉴权失败");
result.setCode("1003");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
} catch (Exception e) {
LOG.error("", e);
result.setMsg("未知错误");
result.setCode("1001");
response.getWriter().write(Constant.gson.toJson(result));
return false;
}
return true;
}
private boolean checkMD5(String uidstr, String auth_appkey, List<String> keys, Map<String, String[]> params, String auth_sign) {
boolean result = true;
StringBuffer data = new StringBuffer(uidstr);
for (String key : keys) {
if ("uid".equals(key) || "sign".equals(key)) {
continue;
}
data.append(key).append("=").append(((String[]) params.get(key))[0]);
}
data.append(auth_appkey);
String md5 = "";
try {
md5 = DigestUtils.md5Hex(data.toString().getBytes("UTF-8")).toLowerCase();
} catch (UnsupportedEncodingException unsupportedEncodingException) {
}
LOG.debug("request data" + data + ",md5:" + md5 + ",sign:" + auth_sign);
if (md5.equals(auth_sign)) {
result = true;
} else {
result = false;
}
return result;
}
}