Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON Web令牌(JWT):我应该使用响应头还是响应体来传输令牌?_Java_Spring_Rest_Jwt - Fatal编程技术网

Java JSON Web令牌(JWT):我应该使用响应头还是响应体来传输令牌?

Java JSON Web令牌(JWT):我应该使用响应头还是响应体来传输令牌?,java,spring,rest,jwt,Java,Spring,Rest,Jwt,我正在开发一个RESTful web服务,它以JSON web令牌(JWT)的形式发布访问令牌,以便客户端可以使用它们进行进一步授权。目前,我将令牌存储在响应主体中,但通常建议将其添加到授权头中。为什么我应该选择标题而不是响应正文?使用一种方法比另一种方法有什么主要优势吗 @RestController @请求映射(path=“/auth”,products=“application/json”) 公共类访问令牌控制器{ @值(${jwt.secret.key.gen}) 私钥; @值(${jw

我正在开发一个RESTful web服务,它以JSON web令牌(JWT)的形式发布访问令牌,以便客户端可以使用它们进行进一步授权。目前,我将令牌存储在响应主体中,但通常建议将其添加到授权头中。为什么我应该选择标题而不是响应正文?使用一种方法比另一种方法有什么主要优势吗

@RestController
@请求映射(path=“/auth”,products=“application/json”)
公共类访问令牌控制器{
@值(${jwt.secret.key.gen})
私钥;
@值(${jwt.expiration.days})
私人int到期日;
私有最终用户Repository用户Repository;
专用最终密码编码器;密码编码器;
@自动连线
public AccessTokenController(UsersRepository UsersRepository,PasswordEncoder PasswordEncoder){
this.usersRepository=usersRepository;
this.passwordEncoder=passwordEncoder;
}
@PostMapping(value=“/access token”,consumes=“application/json”)
ResponseEntity getAccessToken(@RequestBody映射凭据){
//#1:检查请求正文中的用户名和密码
字符串用户名=凭证。获取(“用户名”);
字符串密码=凭据。获取(“密码”);
if(username.isBlank()| | password.isBlank())
抛出新的IllegalArgumentException();
//#2:检查数据库中给定的用户名和密码
User User=usersRepository.findByUsername(用户名)
.filter(u->passwordEncoder.matches(密码,u.getPassword()))
.orelsetrow(()->new BadCredentialsException(“没有使用给定密码的用户”);
//#3:检查请求用户的“已启用”状态
如果(!user.isEnabled())
抛出新的DisabledException(“用户当前已禁用”);
//#4:创建并返回访问令牌(最终!)
字符串标记=Jwts.builder()
.setSubject(用户名)
.setExpiration(新日期(System.currentTimeMillis()+expirationDays*24*60*60*1000))
.signWith(SignatureAlgorithm.HS512,secretKey.getBytes())
.compact();
返回新的响应属性(Collections.singletonMap(“访问令牌”,token),
HttpStatus.OK);
}
@ExceptionHandler({JsonParseException.class,NullPointerException.class,IllegalArgumentException.class})
@ResponseStatus(HttpStatus.BAD_请求)
公共地图句柄RongormisingCredentials(){
返回集合。singletonMap(“错误”、“错误或缺少凭据”);
}
@ExceptionHandler(AuthenticationException.class)
@响应状态(HttpStatus.UNAUTHORIZED)
公共映射handleAuthenticationException(AuthenticationException ex){
返回Collections.singletonMap(“error”,例如getMessage());
}
}

它是所有api都遵循的HTTP标准的一部分。从根本上讲,考虑一组每个人都遵循的规则,这样当人们开发服务器或客户端时,他们就可以遵循这组规则来避免差异

RFC

“授权”标题字段允许用户代理进行身份验证
它本身带有一个源服务器——通常,但不一定,在
接收401(未经授权)响应。其值包括
包含用户身份验证信息的凭据
正在请求的资源领域的代理

 Authorization = credentials
人们现在可以使用许多不同类型的授权头,一旦您使用了它,您就知道会发生什么。下面是一个简单的列表来显示一些

       •    Basic Auth
       •    Bearer Token
       •    API Key
       •    Digest Auth
       •    Oauth 2.0
       •    Hawk Authentication
       •    AWS Signature

它是所有api都遵循的HTTP标准的一部分。从根本上讲,考虑一组每个人都遵循的规则,这样当人们开发服务器或客户端时,他们就可以遵循这组规则来避免差异

RFC

“授权”标题字段允许用户代理进行身份验证
它本身带有一个源服务器——通常,但不一定,在
接收401(未经授权)响应。其值包括
包含用户身份验证信息的凭据
正在请求的资源领域的代理

 Authorization = credentials
人们现在可以使用许多不同类型的授权头,一旦您使用了它,您就知道会发生什么。下面是一个简单的列表来显示一些

       •    Basic Auth
       •    Bearer Token
       •    API Key
       •    Digest Auth
       •    Oauth 2.0
       •    Hawk Authentication
       •    AWS Signature