一、http Basic认证

1、postman中实现http basic 认证

http协议定义的一种认证方式,将客户端id和客户端密码按照“客户端ID:客户端密码”的格式拼接,并用base64编 码,放在header中请求服务端,

一个例子: Authorization:Basic WGNXZWJBcHA6WGNXZWJBcHA= 

WGNXZWJBcHA6WGNXZWJBcHA= 是用户名:密码的base64编码。 

我们使用base64解码,如下所示:

当在postman中使用如下basic Auth认证时,

此时,请求头中会多出一个Authorization的头信息,如下:

认证失败服务端返回 401 Unauthorized

2、http basic认证的Java代码实现

 相关Java代码如下:

LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
String httpBasic = getHttpBasic(clientId, clientSecret);
headers.add("Authorization",httpBasic);
public String getHttpBasic(String clientId,String clientSecret){
        String string=clientId+":"+clientSecret;
        //将串进行Base64编码
        byte[] encode = Base64Utils.encode(string.getBytes());
        return "Basic "+new String(encode);
    }

客户端Id和客户端密码会匹配数据库oauth_client_details表中的客户端id及客户端密码。

oauth_client_details表结构如下:

CREATE TABLE `oauth_client_details` (
  `client_id` varchar(48) NOT NULL,
  `resource_ids` varchar(256) DEFAULT NULL,
  `client_secret` varchar(256) DEFAULT NULL,
  `scope` varchar(256) DEFAULT NULL,
  `authorized_grant_types` varchar(256) DEFAULT NULL,
  `web_server_redirect_uri` varchar(256) DEFAULT NULL,
  `authorities` varchar(256) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(4096) DEFAULT NULL,
  `autoapprove` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入一条数据

insert  into `oauth_client_details`(`client_id`,`resource_ids`,`client_secret`,`scope`,`authorized_grant_types`,`web_server_redirect_uri`,
`authorities`,`access_token_validity`,`refresh_token_validity`,`additional_information`,`autoapprove`)
values ('app',NULL,'app','app','password,refresh_token',NULL,NULL,NULL,NULL,NULL,NULL),
('XcWebApp',NULL,'$2a$10$9bEpZ/hWRQxyr5hn5wHUj.jxFpIrnOmBcWlE/g/0Zp3uNxt9QTh/S','app','authorization_code,password,refresh_token,client_credentials',NULL,NULL,43200,43200,NULL,NULL);

二、使用APP_KEY实现认证

  另外,我们也可以在项目中使用appKey来完成认证,即服务端给客户端提供appKey,客户端将appKey放在请求头中去访问服务器,服务器获取请求头中的appKey,根据该appKey去LIMIT表中查是否存在该appKey的记录,如果不存在,则提示”密钥不存在或已过期“,如果存在,则查看是否对IP有限制(是否IP限制,0:否,1:是),如果对IP有限制,则获取请求的IP地址,根据appKey和IP地址去查IP表,如果不存在记录,则提示”IP受限“。如果存在记录,则判断每天可以访问接口次数是否超过限制(每次访问都更新当日日期curDate,并根据curDate修改当日查询次数),如果超过限制,则提示”已超过接口访问次数限制“,如果没有超过则放行。我们甚至可以限制每秒调用接口次数。

LIMIT表有如下字段:APP_KEY、COUNT(每天可以访问接口次数)、QPS_LIMIT(每秒调用接口次数限制)、CUR_DATE(当前时间)、CUR_DATE_QUERY_COUNT(当前日期请求次数)、IP_LIMIT(是否IP限制,0:否,1:是)

IP表有如下字段:APP_KEY、IP_ADDR

 

posted on 2021-01-25 09:31  周文豪  阅读(3160)  评论(0编辑  收藏  举报