当前位置: 首页 > 知识库问答 >
问题:

如何将当前添加到响应的auth头的承载令牌添加到响应体?

白淇
2023-03-14

我通过使用承载令牌实现了对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标题。

谢啦

共有1个答案

颜啸
2023-03-14

我通过将“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