Как сохранить токен доступа в куки в OAuth2? - PullRequest
0 голосов
/ 08 апреля 2019

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

Я прошел через Интернет и не смог найти способ поместить токены в куки. Может кто-нибудь, пожалуйста, помогите мне с этим?

1 Ответ

0 голосов
/ 29 апреля 2019

Наконец-то нашли решение для этого.Я создал / логин API, где я устанавливаю токен доступа в куки.

@PostMapping(consumes = "application/json")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest,
                               HttpServletResponse httpResponse) throws Exception {

    ResponseEntity<?> result = null;
    try {
        String url = UriComponentsBuilder.fromHttpUrl(environment.getProperty("oauth.token.url"))
                .queryParam("username", loginRequest.getUsername())
                .queryParam("password", loginRequest.getPassword())
                .queryParam("grant_type", OauthConstants.GRANT_TYPE_PASSWORD)
                .toUriString();

        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        headers.add(AppConstants.AUTHORIZATION_HEADER, AppConstants.AUTH_HEADER_CLIENT_DEFAULT);
        HttpEntity<String> httpEntity = new HttpEntity<>(headers);

        ResponseEntity<HashMap> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, HashMap.class);
        Map<String, Object> authMap = response.getBody();

        logger.info("Adding cookies");
        String accessToken =  (String) authMap.get(AppConstants.ACCESS_TOKEN);
        String refreshToken =  (String)authMap.get(AppConstants.REFRESH_TOKEN);

        List<Cookie> cookies = new ArrayList<>();
        cookies.add(newAppCookie(AppConstants.ACCESS_TOKEN, accessToken));
        cookies.add(newAppCookie(AppConstants.REFRESH_TOKEN, refreshToken));

        cookies.stream().forEach(c -> httpResponse.addCookie(c));
        logger.info("Cookies added successfully");
        result = ResponseEntity.ok(authMap);
    } catch (HttpClientErrorException hex) {
        logger.error("HttpClientErrorException occurred in login(): ", hex);
        result = new ResponseEntity<>(hex.getResponseBodyAsString(), 
                HttpStatus.UNAUTHORIZED);
    } catch (Exception e) {
        logger.error("Exception occurred in login(): ", e);
        throw e;
    }
    return result;

И после того, как пользователь входит в систему, для каждого запроса API к серверу применяется Фильтр для проверки того, что токен доступа в файлах cookie является действительным или нет, как показано ниже.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ApplicationOAuthFilter implements Filter {

private static final Logger logger = LoggerFactory.getLogger(AuthFilter.class);

@Autowired
private Environment environment;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {


    HttpServletRequest httpRequest = (HttpServletRequest) request;
    if (httpRequest.getRequestURI().equals("/oauth/token")||
    httpRequest.getRequestURI().equals("/login")) {
        chain.doFilter(request, response);
        return;
    }

    Cookie[] cookies = httpRequest.getCookies();
    if (cookies == null) {
        logger.info("No Cookies found");
        chain.doFilter(request, response);
        return;
    }

    Map<String,String> cookiesMap = Arrays.asList(cookies).stream().collect(Collectors.toMap(Cookie::getName, Cookie::getValue));
    if (!cookiesMap.containsKey(AppConstants.ACCESS_TOKEN)) {
        logger.info("No Access token found in cookie");
        chain.doFilter(request, response);
        return;
    }

    /**
     * Proper request comes here.
     */
    ApplicationRequestWrapper mutableRequest = new ApplicationRequestWrapper(httpRequest);
    mutableRequest.putHeader("Authorization","Bearer "+ cookiesMap.get(AppConstants.ACCESS_TOKEN)); 
    logger.info("Access token found in cookie");
    chain.doFilter(mutableRequest, response);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...