为什么调用接口header要加sign和time

时间: 2023-11-27 19:05:39 浏览: 19
调用接口时,添加sign和time这两个参数主要是为了实现接口的安全性和防止非法访问。 首先,sign参数用于对请求进行签名,可以确保请求的完整性和合法性。签名通常是通过对请求参数进行加密或者哈希计算得到的,接收方可以根据同样的算法验证签名是否匹配,从而确定请求是否被篡改。 其次,time参数用于防止重放攻击。重放攻击是指攻击者截获合法请求后,再次发送相同的请求来进行欺骗或者恶意操作。通过在每个请求中添加时间戳参数,可以确保每个请求都是唯一的,避免被重放。 综上所述,添加sign和time这两个参数可以提高接口的安全性,防止非法访问和重放攻击。
相关问题

Spring Security如何在接口中登录方式

Spring Security提供了多种方式来实现接口中的登录,其中常见的方式是使用token认证。以下是一个简单的示例: 1. 配置Spring Security 在Spring Security的配置文件中,需要配置一个TokenAuthenticationFilter来处理token认证。具体如下: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtTokenProvider jwtTokenProvider; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .apply(new JwtConfigurer(jwtTokenProvider)); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public JwtTokenProvider jwtTokenProvider() { return new JwtTokenProvider(); } @Bean public TokenAuthenticationFilter jwtAuthenticationTokenFilter() throws Exception { return new TokenAuthenticationFilter(); } } ``` 2. 创建TokenAuthenticationFilter TokenAuthenticationFilter是一个过滤器,用于在请求头中读取并验证token。具体如下: ```java public class TokenAuthenticationFilter extends OncePerRequestFilter { @Autowired private JwtTokenProvider jwtTokenProvider; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = jwtTokenProvider.resolveToken(request); if (token != null && jwtTokenProvider.validateToken(token)) { Authentication auth = jwtTokenProvider.getAuthentication(token); if (auth != null) { SecurityContextHolder.getContext().setAuthentication(auth); } } filterChain.doFilter(request, response); } } ``` 3. 创建JwtTokenProvider JwtTokenProvider用于生成和验证token。具体如下: ```java public class JwtTokenProvider { private static final String SECRET_KEY = "secret_key"; private static final long EXPIRATION_TIME = 864_000_000; // 10 days private static final String TOKEN_PREFIX = "Bearer "; private static final String HEADER_STRING = "Authorization"; public String createToken(String username) { Claims claims = Jwts.claims().setSubject(username); Date now = new Date(); Date validity = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(validity) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public Authentication getAuthentication(String token) { String username = getUsername(token); User user = userService.loadUserByUsername(username); return new UsernamePasswordAuthenticationToken(user, "", user.getAuthorities()); } public String getUsername(String token) { return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject(); } public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (SignatureException | MalformedJwtException | ExpiredJwtException | UnsupportedJwtException | IllegalArgumentException ex) { return false; } } public String resolveToken(HttpServletRequest request) { String bearerToken = request.getHeader(HEADER_STRING); if (bearerToken != null && bearerToken.startsWith(TOKEN_PREFIX)) { return bearerToken.substring(TOKEN_PREFIX.length()); } return null; } } ``` 4. 创建登录接口 在登录接口中,需要调用JwtTokenProvider.createToken方法生成token,并将token返回给客户端。具体如下: ```java @RestController public class LoginController { @Autowired private JwtTokenProvider jwtTokenProvider; @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( loginRequest.getUsername(), loginRequest.getPassword() ) ); SecurityContextHolder.getContext().setAuthentication(authentication); String token = jwtTokenProvider.createToken(loginRequest.getUsername()); return ResponseEntity.ok(new JwtResponse(token)); } } ``` 5. 测试接口 使用Postman等工具发送请求,将生成的token放入请求头中,即可访问需要登录后才能访问的接口。

var url = '/api/pc/ca/manager/member/modify/applyInfo/page'; //1.dologin var bsmpUrl = pm.environment.get("server.url.bsmp"); var username = pm.environment.get("bsmp.login.pc.username"); var password = pm.environment.get("bsmp.login.pc.password"); var salt = pm.environment.get("bsmp.login.pc.salt"); var orgId = pm.environment.get("bsmp.login.pc.orgId"); var orgLevel = pm.environment.get("bsmp.login.pc.orgLevel"); let echoPostRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/login', method: 'POST', header: [ "Content-Type: application/json; charset=UTF-8" ], body: { mode: 'raw', raw: '{\"username\":\"'+username+'\",\"password\":\"'+password+'\",\"salt\":\"'+salt+'\"}' } }; let echoGetRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/complete' + '?' + 'orgId='+ orgId + '&' + 'orgLevel=' + orgLevel + '&' + 'time=' + '0.366126544927456', method: 'GET' }; pm.sendRequest(echoPostRequest, function (err, res) { console.log("loginRsp:" + res.json()); console.log("token:" + res.json().data) //2.doSign var token = res.json().data; var str = token + url pm.globals.set("temp", str); var sign = CryptoJS.MD5(str).toString(); pm.globals.set("token",token ); pm.globals.set("sign", sign); }); pm.sendRequest(echoGetRequest, function (err, res) { console.log("res:" + res.json()); }); 如何将此代码中的两个接口,按照顺序调用

可以使用回调函数或Promise对象来保证这两个接口按照顺序调用。 使用回调函数的方式,可以在第一个请求的回调函数中调用第二个请求。例如: ``` var url = '/api/pc/ca/manager/member/modify/applyInfo/page'; var bsmpUrl = pm.environment.get("server.url.bsmp"); var username = pm.environment.get("bsmp.login.pc.username"); var password = pm.environment.get("bsmp.login.pc.password"); var salt = pm.environment.get("bsmp.login.pc.salt"); var orgId = pm.environment.get("bsmp.login.pc.orgId"); var orgLevel = pm.environment.get("bsmp.login.pc.orgLevel"); function doLogin(callback) { let echoPostRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/login', method: 'POST', header: [ "Content-Type: application/json; charset=UTF-8" ], body: { mode: 'raw', raw: '{\"username\":\"'+username+'\",\"password\":\"'+password+'\",\"salt\":\"'+salt+'\"}' } }; pm.sendRequest(echoPostRequest, function (err, res) { console.log("loginRsp:" + res.json()); console.log("token:" + res.json().data); var token = res.json().data; var str = token + url; pm.globals.set("temp", str); var sign = CryptoJS.MD5(str).toString(); pm.globals.set("token",token ); pm.globals.set("sign", sign); callback(); }); } function doSign() { var token = pm.globals.get("token"); var sign = pm.globals.get("sign"); let echoGetRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/complete' + '?' + 'orgId='+ orgId + '&' + 'orgLevel=' + orgLevel + '&' + 'time=' + '0.366126544927456' + '&' + 'token=' + token + '&' + 'sign=' + sign, method: 'GET' }; pm.sendRequest(echoGetRequest, function (err, res) { console.log("res:" + res.json()); }); } doLogin(function() { doSign(); }); ``` 使用Promise对象的方式,可以通过链式调用then方法来保证接口按照指定的顺序调用。例如: ``` var url = '/api/pc/ca/manager/member/modify/applyInfo/page'; var bsmpUrl = pm.environment.get("server.url.bsmp"); var username = pm.environment.get("bsmp.login.pc.username"); var password = pm.environment.get("bsmp.login.pc.password"); var salt = pm.environment.get("bsmp.login.pc.salt"); var orgId = pm.environment.get("bsmp.login.pc.orgId"); var orgLevel = pm.environment.get("bsmp.login.pc.orgLevel"); function doLogin() { return new Promise(function(resolve, reject) { let echoPostRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/login', method: 'POST', header: [ "Content-Type: application/json; charset=UTF-8" ], body: { mode: 'raw', raw: '{\"username\":\"'+username+'\",\"password\":\"'+password+'\",\"salt\":\"'+salt+'\"}' } }; pm.sendRequest(echoPostRequest, function (err, res) { console.log("loginRsp:" + res.json()); console.log("token:" + res.json().data); var token = res.json().data; var str = token + url; pm.globals.set("temp", str); var sign = CryptoJS.MD5(str).toString(); pm.globals.set("token",token ); pm.globals.set("sign", sign); resolve(); }); }); } function doSign() { var token = pm.globals.get("token"); var sign = pm.globals.get("sign"); let echoGetRequest = { url: 'http://' + bsmpUrl + '/api/pc/proxy/complete' + '?' + 'orgId='+ orgId + '&' + 'orgLevel=' + orgLevel + '&' + 'time=' + '0.366126544927456' + '&' + 'token=' + token + '&' + 'sign=' + sign, method: 'GET' }; pm.sendRequest(echoGetRequest, function (err, res) { console.log("res:" + res.json()); }); } doLogin() .then(function() { doSign(); }); ```

相关推荐

最新推荐

recommend-type

php接口数据加密、解密、验证签名

//header(‘Content-Type: text/xml; charset=utf-8’); include_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.’phpsec’.DIRECTORY_SEPARATOR.’Math’.DIRECTORY_SEPARATOR.’BigInteger.php’); ...
recommend-type

nginx配置教程之add_header的坑详解

主要给大家介绍了关于nginx配置教程之add_header坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

Element PageHeader页头的使用方法

主要介绍了Element PageHeader页头的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Golang 发送http请求时设置header的实现

某天,在需要抓取某个网页信息的时候,需要在header中增加一些信息,于是搜索了一下,如何在golang发起的http请求中设置header。 package main import ( "fmt" "io/ioutil" "net/http" "os" "encoding/json" )...
recommend-type

浅析HTML5中header标签的用法

header标签不同于我们最熟悉的head标签,header往往更常被用于定义文章的头部,下面我们就来浅析HTML5中header标签的用法:
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。