授权
- 采用 ngxin, 后期可考虑 OpenResty(nginx+lua)
- 以ubuntu为例
> cd /etc/nginx/ > htpasswd -c -d /etc/nginx/passwd.db username > password
- 改nginx配置文件
> cd /etc/nginx/ > vi nginx.conf server { auth_basic "User Authentication"; auth_basic_user_file /etc/nginx/passwd.db; } > nginx -s reload
- 之后每个请求都必须带上 username:password
- spring restTemplate
HttpHeaders createHeaders(String username, String password){ return new HttpHeaders() {{ String auth = username + ":" + password; byte[] encodedAuth = Base64.encodeBase64( auth.getBytes(Charset.forName("US-ASCII")) ); String authHeader = "Basic " + new String( encodedAuth ); set( "Authorization", authHeader ); }}; } clazz result = restTemplate.exchange(uri, HttpMethod.POST, new HttpEntity<T>(createHeaders("username", "password")), clazz);
or
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("username", "password"));
认证
- app_key app_secret 相当于这个app的用户名 密码 用一个表维护 将来可以为不同的app分配不同的接口访问权限
- RSA public_key private_key RSA加密的公钥 秘钥 参数加密使用 防止明文传输
- time_millis 当前时间 between the current time and midnight, January 1, 1970 UTC. 每个请求必带
- user_id 登入后的user_id 未登入状态不需要传值 需要登入的每个请求必带
- sign 根据参数md5后的签名 每个请求必带
- token 登入后的标示 需要登入的每个请求必带
- 未登入情况下
- 如 http://app.yiwugou.com/login.html?time_millis={time_millis} post {username:"username",password:"password"}
- 获取参数的键值对 time_millis={time_millis}&username={username}&password={password} 如果是post方式 也把post的值加入到键值对中 统一加密
- 加入app_key app_secret 后 按照参数的ascii码排序 得到 app_key={appkey}&app_secret={secret}&password={password}&time_millis={time_millis}&username={username} 记为 param_after_sort
- 对上述字段进行md5后 得到sign签名 sign=MD5(param_after_sort)
- 对 param_after_sort 删除app_secret,加上sigin 得到 app_key={appkey}&password={password}&time_millis={time_millis}&username={username}&sign={sign} 记为 param_after_sign
- 对 param_after_sign 进行RSA加密 得到 data = RSA(param_after_sign)
- 最终的传值为
** post http://app.yiwugou.com/login.html {app_key:{app_key},data:{data}} (建议采用这种方式 防止数据量过大)
** get http://app.yiwugou.com/login.html?app_key={app_key}&data={data}
- 最终的传值为
- 如需加入统计参数 如(shop_id,product_id,即不影响具体业务的) 则在上述加密处理完成之后加上特定的参数即可 统计参数不影响加密 如
** post http://app.yiwugou.com/login.html?shop_id={shop_id} {app_key:{app_key},data:{data}}
** get http://app.yiwugou.com/login.html?product_id={product_id}&shop_id={shop_id}&app_key={app_key}&data={data} 参数顺序随意
- 登入后 返回 RSA(token),防止被人抓包解密token,app端解密;
- 在上面的第3步中加入 token user_id 后排序 得到 app_key={app_key}&app_secret={app_secret}&password={password}&time_millis={time_millis}&token={token}&user_id={user_id}&username={username}
- 其他照常进行
网友评论