我通过使用承载令牌实现了对SpringBoot API的授权,当登录成功时,该令牌被添加到响应的“授权”头中,然后需要通过React项目的登录获取方法读取该令牌,并添加到后续请求的“授权”头中。
不幸的是,虽然我被告知这是不可能使用Fetch,所以我现在试图重构我的登录功能,以便它返回响应正文中的令牌,而不是标题。
我不知道如何做到这一点,目前没有返回JSON正文对象,只有标头,我将不得不更改我的许多AuthorizationFilter和身份验证过滤器类。如果有人能给我指明正确的方向,或者建议我改变什么,我将不胜感激。
谢谢
授权筛选器:
public class AuthorizationFilter extends BasicAuthenticationFilter {
public AuthorizationFilter(AuthenticationManager authenticationManager) { super(authenticationManager);}
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
String header = request.getHeader("Authorization");
if(header == null || !header.startsWith("Bearer")) {
filterChain.doFilter(request,response);
return;
}
UsernamePasswordAuthenticationToken authenticationToken = getAuthentication(request);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request,response);
}
private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
String token = request.getHeader("Authorization");
if(token != null) {
String user = Jwts.parser().setSigningKey("SecretKeyToGenJWTs".getBytes())
.parseClaimsJws(token.replace("Bearer",""))
.getBody()
.getSubject();
if(user != null) {
return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());
}
return null;
}
return null;
}
}
AuthenticationFilter:
public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationManager authenticationManager;
public AuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
setFilterProcessesUrl("/login");
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
try {
com.example.gambit2.domain.User creds = new ObjectMapper().readValue(request.getInputStream(), com.example.gambit2.domain.User.class);
return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(creds.getUsername(), creds.getPassword(),new ArrayList<>()));
}
catch(IOException e) {
throw new RuntimeException("Could not read request" + e);
}
}
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain, Authentication authentication)
{
String token = Jwts.builder()
.setSubject(((User) authentication.getPrincipal()).getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 864_000_000))
.signWith(SignatureAlgorithm.HS512, "SecretKeyToGenJWTs".getBytes())
.compact();
response.addHeader("Authorization","Bearer " + token);
}
}
UserController的注册方法:
@PostMapping("/signup")
public void signUp(@RequestBody User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepository.save(user);
System.out.println(user.getUsername() + " SAVED SUCCESSFULLY");
}
反应Home.js:
const SIGNUP_URL = 'http://localhost:8080/users/signup';
const LOGIN_URL = 'http://localhost:8080/login';
class Home extends Component {
constructor(props) {
super(props);
this.state = {
isAuthenticated:false,
resData: ''
};
}
componentDidMount() {
const payload = {
"username": "hikaru",
"password": "JohnSmith72-"
};
fetch(SIGNUP_URL, {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
})
.then(response => response.json())
.then((data) => {
console.log(data);
});
fetch(LOGIN_URL, {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
})
.then(response =>
console.log(response.headers.get("Authorization")
);
}
在上面的获取调用中,/signup成功,并且服务器输出“Tim成功保存”,登录也成功,但是令牌作为响应发送,并且“控制台”。日志(response.headers.get(“Authorization”)返回“null”。
我知道CORS读取将不适用于auth头,因为它只能用于喜欢4头,对吗?
我尝试添加一个方法,该方法循环遍历每个条目并打印它们,然后在中调用它。那么()就其本身而言:
.then(response => this.iterateThroughEntries(response)
);
但这只打印默认标题,而不是auth标题。
谢啦
我通过将“localhost:8080”“localhost:3000”添加为源并将授权标头添加为公开标头来更新WebSecurity配置类中的CorsSource,从而成功地从服务器获取授权标头,以便CORS请求可以使用它。
configuration.addExposedHeader("Authorization");
我非常确定“Expires”是有效的HTTP响应头类型。但是当我尝试在代码中设置它时:(这是在ActionFilter.OnActionExecuted方法中) 我最后有一个例外: InvalidOperationException:错误使用的标头名称。确保请求头与HttpRequestMessage一起使用,响应头与HttpResponseMessage一起使用,内容头与HttpContent对
问题内容: 我有一个Flask Web应用程序,它使用render_template如下,我需要在响应中添加一个Content-Security-Policy作为附加的HTTP响应标头。我尝试了以下方法,但都失败了,并给了我500。 1。 2。 这里有什么问题? 在终端上,以localhost:3001的身份访问Web应用程序时,我看到以下内容 127.0.0.1–[2015年4月6日01:45:
问题内容: 我正在尝试向一些Web服务调用中添加一些响应标头。我使用CXF 2.1.2和JAX- RS编写了Web服务。我需要返回一个对象,我还想向Response添加一些标头。 在不返回javax.ws.rs.core.Response对象的情况下 ,如何在响应中添加标头并仍然返回javabean? 问题答案: 您可以通过Web服务中的@Context注释注入对实际HttpServletResp
因此,现在我想在我的API的swagger文档页面中添加测试这些令牌身份验证API URL的可能性,包括令牌头。我怎么能这么做?。 我的类API视图的快照如下所示:
我有一个Java Servlet类,当我的应用程序中存在身份验证问题时,我尝试在其中设置错误状态。但是,问题是,我可以设置错误状态,但无法在响应正文中设置错误消息。以下是我的尝试: 授权筛选器。Java语言 例外处理程序。Java语言 我的Trowable包含要显示的正确HTTP状态。我尝试了两件事: 我试着按照这个方法做:public ultsendError(int sc,java.lang.
我目前正在我们的项目中实现Spring Cloud Sleuth。我需要将traceId添加到响应标头。有没有办法实现这一点? 谢谢, Anoop