Как включить заголовок авторизации в запрос GET к защищенной конечной точке в Spring с токеном JWT - PullRequest
0 голосов
/ 10 февраля 2020

Я использую Spring-Security и библиотеку JWT для генерации токена. Когда пользователь проходит аутентификацию, я получаю токен авторизации в ответ:

Authorization: Bearer eyJhbGciOiJIUzUxMiJ...

Во всех уроках я видел авторов, вставляющих этот токен в заголовок авторизации при отправке запроса GET с использованием POSTMAN, но не было учебника, как он работает в реальном запросе. Хотя в моем Почтальоне это работает, когда я вставляю заголовки и получаю 200 OK.

Мне интересно, как я могу включить этот заголовок в реальный код?

public class JwtUsernameAndPasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private final AuthenticationManager authenticationManager;
    private final JwtConfig jwtConfig;
    private final SecretKey secretKey;


    public JwtUsernameAndPasswordAuthenticationFilter(
            AuthenticationManager authenticationManager, 
            JwtConfig jwtConfig,
            SecretKey secretKey) {

        this.authenticationManager = authenticationManager;
        this.jwtConfig = jwtConfig;
        this.secretKey = secretKey;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, 
            HttpServletResponse response) throws AuthenticationException { 

        try {       
        System.out.println("Authentication token " + request.getInputStream());
        UsernameAndPasswordAuthenticationRequest authenticationRequest = 
                new ObjectMapper().readValue(request.getInputStream(), 
                UsernameAndPasswordAuthenticationRequest.class);


        Authentication authentication = new UsernamePasswordAuthenticationToken(
                authenticationRequest.getUsername(), 
                authenticationRequest.getPassword()
        );



        SecurityContextHolder.getContext().setAuthentication(authentication);

        Authentication authenticate = authenticationManager.authenticate(authentication);
        return authenticate;

        } catch(IOException e) {
            throw new RuntimeException("new runtime exception " + e);
        }

    }


    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, 
            FilterChain chain, Authentication authResult) throws IOException, ServletException {

        String token = Jwts.builder()
            .setSubject(authResult.getName())
            .claim("authorities", authResult.getAuthorities())
            .setIssuedAt(new Date())
            .setExpiration(java.sql.Date.valueOf(LocalDate.now().plusDays(jwtConfig.getTokenExpirationAfterDays())))
            .signWith(secretKey)
            .compact();

       System.out.println("This is token: " + token);   
       response.addHeader(jwtConfig.getAuthorizationHeader(), jwtConfig.getTokenPrefix() + token);

    } 





}

РЕДАКТИРОВАТЬ

Вот мой запрос веб-интерфейса. После этого звонка я получаю заголовки ответа с токеном авторизации. Теперь вопрос в том, как я могу использовать этот токен для реализации будущих запросов? :

$.ajax({
                      type: 'POST',
                      url: "/login",
                      data: JSON.stringify({
                          "username" : "linda",
                          "password" : "password",

                      }),
                      success: function(response) {
                         // some logic
                         },

                      error: function(e) {
                        console.log(e);
                      },
                      processData: false,
                      //dataType: "json",
                      contentType: "application/json; charset=utf-8"
                    });

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

После аутентификации пользователя вы хотите сохранить возвращенный токен на стороне клиента, используя локальное хранилище или хранилище сеансов. Затем вы защитите любой маршрут / конечную точку, для которой требуется указанный токен (защищенный маршрут). Должна быть установлена ​​система авторизации, которая проверяет наличие токена в заголовке (в том же формате, в котором вы его использовали при отправке запросов через Почтальон). Если токен недействителен или вообще отсутствует в заголовке, он обычно перенаправляет на другой маршрут (часто на страницу входа).

Это не указывается c для Spring, но JSON Web Лексемы. Реализация отличается от одного языка / фреймворка к другому, насколько мне известно, это всегда общая процедура.

0 голосов
/ 11 февраля 2020

Я предлагаю использовать одностраничные фреймворки, такие как angular или реагировать, потому что они предоставляют лучшие инструменты. Но то, какой фреймворк вы используете, полностью зависит от вашего приложения. для JQuery и javascript вы можете использовать это:
вы должны хранить токен в вашем браузере. одним из способов является использование «локального хранилища»:

  success: function(response) {
    // not sure how you send token
    localStorage.setItem('token', response.token)
  },

и добавление заголовка токена к запросу ajax после этого. обратите внимание, что вы должны обрабатывать пустой токен или токен с истекшим сроком действия в вашем коде.

token = localStorage.getItem('token')
$.ajaxSetup({
  headers: { Authorization: 'Bearer ' + token }
})
//call ajax
...