【如何设计安全可靠的开放接口】系列
1. 如何设计安全可靠的开放接口—之Token
2. 如何设计安全可靠的开放接口—之AppId、AppSecret
3. 如何设计安全可靠的开放接口—之签名(sign)
4. 如何设计安全可靠的开放接口【番外篇】—关于MD5应用的介绍
5. 如何设计安全可靠的开放接口—还有哪些安全保护措施
6. 如何设计安全可靠的开放接口—对请求参加密保护
7. 如何设计安全可靠的开放接口【番外篇】— 对称加密算法
前言
前面我们介绍过了token
机制,它可以解决单点登陆、跨域等问题,避免每次都需要用户登陆,不过并不是每个对外开放的接口都是需要用户登陆的,如果是这样,那我们就要想其他的方式来对用户身份进行验证了,一般我们会使用AppId
的方式,实际上你也可以认为它是一种token
机制,只不过换一个名字而已。
AppId的使用
因为AppId
实际上就是一个标识,所以一般只要能保证系统内全局唯一即可,不过,为了能够防止有人拿着别人的AppId
来请求,所以通常AppId
都会配对一个AppSecret
,可以理解为AppId
的密码,最终的接口请求内容会根据AppId
和AppSecret
并按照一定的规则来生成一套签名,当请求方带着签名值去请求提供方时,提供方就会验证这个签名,只有验证通过才会继续处理。
AppId的生成
正如前面所说,AppId
生成只要保证全局唯一即可,所以这里就不过多介绍了。
AppSecret生成
AppSecret
的生成也很简单,只要与AppId
能关联起来保证唯一即可。
PS:AppSecret后续会用于生成Sign(签名),因此一定要注意AppSecret的保密性,并且不能在网络中进行传输。
appSecret生成代码示例
public class AppUtils {
static Map<String, String> appMap = Maps.newConcurrentMap();
public static void main(String[] args) throws NoSuchAlgorithmException {
// 方式一演示
buildSimpleAppSecret("abc");
System.out.println(getAppSecret("abc"));
}
/**
* 构建简单的appSecret,比如:使用UUID
*
* @param appId
*/
public static void buildSimpleAppSecret(String appId) {
appMap.put(appId, UUID.randomUUID().toString());
}
private static String getAppSecret(String appId) {
return String.valueOf(appMap.get(appId));
}
}
总结
AppId
和AppSecret
的生成都比较简单,总的来说只要保证唯一、且能够匹配的上即可,需要注意的就是AppSecret
就像是密码一样,是需要保密的,接口请求方与接口提供方可以通过私信沟通的方式来约定AppId
和AppSecret
,当然做的比较好的是,接口提供方通过专门的工具让接口请求方自行生成AppSecret
。
另外, AppId
和AppSecret
必须要结合sign
(签名)使用,否则就没有意义,下节我们就来介绍sign
。