Skip to content

Commit d9f6c01

Browse files
committed
optimize callback valid func
1 parent d638ee0 commit d9f6c01

File tree

2 files changed

+37
-30
lines changed

2 files changed

+37
-30
lines changed

src/main/java/com/qiniu/util/Auth.java

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -215,57 +215,44 @@ public String signRequest(String urlString, byte[] body, String contentType) {
215215
/**
216216
* 验证回调签名是否正确,此方法仅能验证 QBox 签名以及 GET 请求的 Qiniu 签名
217217
*
218-
* @param originAuthorization 待验证签名字符串,以 "QBox "作为起始字符
218+
* @param originAuthorization 待验证签名字符串,以 "QBox " 作为起始字符,GET 请求支持 "Qiniu " 开头。
219219
* @param url 回调地址
220220
* @param body 回调请求体。原始请求体,不要解析后再封装成新的请求体--可能导致签名不一致。
221-
* @param contentType 回调ContentType
221+
* @param contentType 回调 ContentType
222222
* @return
223223
*/
224224
@Deprecated
225225
public boolean isValidCallback(String originAuthorization, String url, byte[] body, String contentType) {
226-
return isValidCallback(originAuthorization, url, "GET", contentType, body);
227-
}
228-
229-
/**
230-
* 验证回调签名是否正确
231-
*
232-
* @param originAuthorization 待验证签名字符串,以 "QBox "作为起始字符
233-
* @param url 回调地址
234-
* @param method 回调请求方式
235-
* @param body 回调请求体。原始请求体,不要解析后再封装成新的请求体--可能导致签名不一致。
236-
* @param contentType 回调ContentType
237-
* @return
238-
*/
239-
public boolean isValidCallback(String originAuthorization, String url, String method, String contentType, byte[] body) {
240226
Headers header = null;
241227
if (!StringUtils.isNullOrEmpty(contentType)) {
242228
header = new Headers.Builder()
243229
.add(HTTP_HEADER_KEY_CONTENT_TYPE, contentType)
244230
.build();
245231
}
246-
return isValidCallback(originAuthorization, url, method, header, body);
232+
return isValidCallback(originAuthorization, new Request(url, "GET", header, body));
247233
}
248234

249235
/**
250-
* 验证回调签名是否正确
236+
* 验证回调签名是否正确,此方法支持验证 QBox 和 Qiniu 签名
251237
*
252-
* @param originAuthorization 待验证签名字符串,以 "QBox "作为起始字符
253-
* @param url 回调地址
254-
* @param method 回调请求方式
255-
* @param header 回调头,注意 Content-Type key {@link Auth#HTTP_HEADER_KEY_CONTENT_TYPE}
256-
* @param body 回调请求体。原始请求体,不要解析后再封装成新的请求体--可能导致签名不一致。
238+
* @param originAuthorization 待验证签名字符串,以 "QBox " 或 "Qiniu " 作为起始字符
239+
* @param callback callback 请求信息
257240
* @return
258241
*/
259-
public boolean isValidCallback(String originAuthorization, String url, String method, Headers header, byte[] body) {
242+
public boolean isValidCallback(String originAuthorization, Request callback) {
243+
if (callback == null) {
244+
return false;
245+
}
246+
260247
String authorization = "";
261248
if (originAuthorization.startsWith(QINIU_AUTHORIZATION_PREFIX)) {
262-
authorization = QINIU_AUTHORIZATION_PREFIX + signQiniuAuthorization(url, method, body, header);
249+
authorization = QINIU_AUTHORIZATION_PREFIX + signQiniuAuthorization(callback.url, callback.method, callback.body, callback.header);
263250
} else if (originAuthorization.startsWith(QBOX_AUTHORIZATION_PREFIX)) {
264251
String contentType = null;
265-
if (header != null) {
266-
contentType = header.get(HTTP_HEADER_KEY_CONTENT_TYPE);
252+
if (callback.header != null) {
253+
contentType = callback.header.get(HTTP_HEADER_KEY_CONTENT_TYPE);
267254
}
268-
authorization = QBOX_AUTHORIZATION_PREFIX + signRequest(url, body, contentType);
255+
authorization = QBOX_AUTHORIZATION_PREFIX + signRequest(callback.url, callback.body, contentType);
269256
}
270257
return authorization.equals(originAuthorization);
271258
}
@@ -573,4 +560,24 @@ public int compareTo(Header o) {
573560
}
574561
}
575562
}
563+
564+
public static class Request {
565+
private final String url;
566+
private final String method;
567+
private final Headers header;
568+
private final byte[] body;
569+
570+
/**
571+
* @param url 回调地址
572+
* @param method 回调请求方式
573+
* @param header 回调头,注意 Content-Type Key 字段需为:{@link Auth#HTTP_HEADER_KEY_CONTENT_TYPE},大小写敏感
574+
* @param body 回调请求体。原始请求体,不要解析后再封装成新的请求体--可能导致签名不一致。
575+
**/
576+
public Request(String url, String method, Headers header, byte[] body) {
577+
this.url = url;
578+
this.method = method;
579+
this.header = header;
580+
this.body = body;
581+
}
582+
}
576583
}

src/test/java/test/com/qiniu/util/AuthTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,15 @@ private void checkSignQiniu(String sign, Auth auth, String url, String method, H
9999
String s = auth.signQiniuAuthorization(url, method, body, headers);
100100
// System.out.println(sign + ": " + s + ": " + sign.equals(s) + "\n\n");
101101
assertEquals(sign, s);
102-
assertTrue(auth.isValidCallback("Qiniu " + sign, url, method, headers, body), "checkSignQiniuValid fail, sign:" + sign);
102+
assertTrue(auth.isValidCallback("Qiniu " + sign, new Auth.Request(url, method, headers, body)), "checkSignQiniuValid fail, sign:" + sign);
103103
}
104104

105105
private void checkSignQbox(String sign, Auth auth, String url, String method, Headers headers, byte[] body) {
106106
String contentType = headers.get("Content-Type");
107107
String s = auth.signRequest(url, body, contentType);
108108
// System.out.println(sign + ": " + s + ": " + sign.equals(s) + "\n\n");
109109
assertEquals(sign, s);
110-
assertTrue(auth.isValidCallback("QBox " + sign, url, method, headers, body), "checkSignQiniuValid fail, sign:" + sign);
110+
assertTrue(auth.isValidCallback("QBox " + sign, new Auth.Request(url, method, headers, body)), "checkSignQiniuValid fail, sign:" + sign);
111111
}
112112

113113

0 commit comments

Comments
 (0)