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

Angular无法从Spring Boot接收JWT令牌

全弘深
2023-03-14

我在控制台中得到这个错误:

null
dan
TypeError: Cannot read property 'token' of null
at MapSubscriber.project (basic-authentication.service.ts:29)
at MapSubscriber._next (map.js:29)
at MapSubscriber.next (Subscriber.js:49)
at MapSubscriber._next (map.js:35)
at MapSubscriber.next (Subscriber.js:49)
at FilterSubscriber._next (filter.js:33)
at FilterSubscriber.next (Subscriber.js:49)
at MergeMapSubscriber.notifyNext (mergeMap.js:69)
at InnerSubscriber._next (InnerSubscriber.js:11)
at InnerSubscriber.next (Subscriber.js:49)

我正试图从Angular 7前端验证一个用户。当我使用Postman进行测试时,它对所有请求都非常有效(即使使用JWT令牌)。

我在intelliJ上启用了调试器,再次运行了登录操作,并且正确创建并发送了JWT,但在Angular前端应用程序上,它似乎是空的。

***请注意,我可能是Spring的中级,但在角方面真的是新手

    executeJWTAuthenticationService(username, password) {
    return this.http.post<any>(
      `${API_URL}/login`, {
        username,
        password
      }).pipe(
        map(
          data => {
            console.log(data);
            console.log(username);
            sessionStorage.setItem(AUTHENTICATED_USER, username);
            sessionStorage.setItem(TOKEN, `Bearer ${data.token}`);
            return data;
          }
        )
      );
  }
    public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    private AuthenticationManager authenticationManager;

    public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    /* Trigger when we issue POST request to /login
    We also need to pass in {"username":"dan", "password":"dan123"} in the request body
     */
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {

        // Grab credentials and map them to login viewmodel
        LoginViewModel credentials = null;
        try {
            credentials = new ObjectMapper().readValue(request.getInputStream(), LoginViewModel.class);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Create login token
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                credentials.getUsername(),
                credentials.getPassword(),
                new ArrayList<>());

        // Authenticate user
        Authentication auth = authenticationManager.authenticate(authenticationToken);

        return auth;
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        // Grab principal
        UserPrincipal principal = (UserPrincipal) authResult.getPrincipal();

        // Create JWT Token
        String token = JWT.create()
                .withSubject(principal.getUsername())
                .withExpiresAt(new Date(System.currentTimeMillis() + JwtProperties.EXPIRATION_TIME))
                .sign(HMAC512(JwtProperties.SECRET.getBytes()));

        // Add token in response
        response.addHeader(JwtProperties.HEADER_STRING, JwtProperties.TOKEN_PREFIX + token);
    }
}

共有1个答案

宦正诚
2023-03-14

只需尝试在您的角http调用中观察reponse。然后您将能够从响应头中读取JWT令牌。

executeJWTAuthenticationService(username, password) {
    return this.http.post<any>(
        `${API_URL}/login`, {
            username,
            password
        }, {observe: 'response'}).pipe(
        map(
            data => {
                const token = data.headers.get("Authorization");
                console.log(data);
                console.log(username);
                sessionStorage.setItem(AUTHENTICATED_USER, username);
                sessionStorage.setItem(TOKEN, `Bearer ${token}`);
                return data;
            }
        )
    );
}
 类似资料:
  • Angular and SpringBoot both have way too much of magic, if you are one who like to be in controll of their code, then check > out my project on pure Java 11 (With Modules), Jersey and Vue.JS for UIWeb

  • 我是spring boot和spring security的新手,我正在尝试实现oauth2来生成一个JWT,并且在angular5应用程序中使用了这个令牌,我的情况是,在实现之后,如果使用postman或curl,我可以获得令牌,但是当我在angular中使用我的web客户端时,我无法获得令牌。 我就是这么做的。 我的登录方法是有角度的 我的授权服务器 我的资源服务器 网络安全

  • 我试图通过一个到Spring(基本身份验证)安全RESTAPI的绝对URL发出POST请求 读到Angular没有为绝对URL自动将X-XSRF-TOKEN插入请求头之后,我尝试实现一个HttpInterceptor来添加TOKEN。 在我最初的 /signinPOST请求中,我创建了必要的授权:基本标头,以确保Spring验证请求。 返回的响应标头包含预期的set-cookie令牌: 但是,在我

  • 我正在尝试构建一个简单的应用程序,可以从FCM(Firebase云消息传递系统)接收通知。我能够生成令牌并将其显示在文本视图中。另外,我还编写了在“FirebaseMessagingService”类“中使用log.d()在LOG上打印通知消息的逻辑,该类从”FirebaseMessagingService“扩展而来。但是,一旦我从FCM控制台发送消息,应用程序就会崩溃,并且在Android显示器

  • CORS策略阻止从来源“http://localhost:8080/socket.io/?eio=3&transport=polling&t=mgbuvgw”访问位于“http://localhost:4200”的XMLHttpRequest:请求的资源上没有“Access-Control-Allow-Origin”标头。

  • 我在验证用户时遇到问题。登录工作正常,我从API收到一个令牌。我将其保存在Angular应用程序中的JwtTokenService中,在执行请求(例如删除)时,我添加了带有值“Bearer token”的“Authorization”头,就像我之前在PostMan中所做的那样。客户要求: 我得到302状态代码和重定向到帐户/登录,即使我没有这样的溃败 控制台错误: CORS策略阻止了从https: