一、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