微服务 授权与验证


授权

  • 采用 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(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 登入后的标示 需要登入的每个请求必带
  • 未登入情况下
      1. 如 http://app.yiwugou.com/login.html?time_millis={time_millis} post {username:"username",password:"password"}
      1. 获取参数的键值对 time_millis={time_millis}&username={username}&password={password} 如果是post方式 也把post的值加入到键值对中 统一加密
      1. 加入app_key app_secret 后 按照参数的ascii码排序 得到 app_key={appkey}&app_secret={secret}&password={password}&time_millis={time_millis}&username={username} 记为 param_after_sort
      1. 对上述字段进行md5后 得到sign签名 sign=MD5(param_after_sort)
      1. 对 param_after_sort 删除app_secret,加上sigin 得到 app_key={appkey}&password={password}&time_millis={time_millis}&username={username}&sign={sign} 记为 param_after_sign
      1. 对 param_after_sign 进行RSA加密 得到 data = RSA(param_after_sign)
      1. 最终的传值为
        ** 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}
  • 其他照常进行

你可能感兴趣的:(微服务 授权与验证)