Невозможно увидеть куки в ответ от сервера в Chrome - PullRequest
0 голосов
/ 26 сентября 2018

То же, что и Почему Chrome игнорирует заголовок Set-Cookie? , но я предоставил код для используемых мной фреймворков.

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

У меня естьзастрял на это слишком долго. Все отлично работает в Почтальон, Firefox, и т.д., и т.д., но Chrome упорно отказывается принять заголовок Set-Cookie.

1008 * Мой сервер (Spring Zuul Proxy) 1010*

Довольно открыто, но не беспокойтесь об этом, я сожму, как только у меня это заработает.

Я хочу сохранить refresh_token в cookie только для HTTP, я расслабил это для тестирования, чтобы увидеть,файл cookie установлен.

Мой PostFilter для установки файла cookie перед отправкой ответа.

@Component

открытый класс CustomPostZuulFilter extends ZuulFilter {

private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final ObjectMapper mapper = new ObjectMapper();
// Default is 30 days
@Value("${oauth.http.cookie.maxAge:2592000}")
private int cookieMaxAge;

@Override
public Object run() {
    final RequestContext ctx = RequestContext.getCurrentContext();
    logger.info("PostZuulFilter called: " + ctx.getRequest().getRequestURI());

    final String requestURI = ctx.getRequest().getRequestURI();
    final String requestMethod = ctx.getRequest().getMethod();

    try {
        final InputStream is = ctx.getResponseDataStream();
        String responseBody = IOUtils.toString(is, "UTF-8");
        if (responseBody.contains("refresh_token")) {
            final Map<String, Object> responseMap =
                    mapper.readValue(responseBody,
                            new TypeReference<Map<String, Object>>() {
            });
            final String refreshToken = responseMap.get("refresh_token").toString();
            logger.info("Decoding refresh token from response.");
            decodeJwtToken(refreshToken);
            responseMap.remove("refresh_token");
            responseBody = mapper.writeValueAsString(responseMap);

            final Cookie cookie = new Cookie("refreshToken", refreshToken);

            // cookie.setHttpOnly(true);
            // cookie.setSecure(true);
            cookie.setPath(ctx.getRequest().getContextPath() + "/oauth/token");
            cookie.setMaxAge(cookieMaxAge); // 30 days

            ctx.getResponse().addCookie(cookie);
            logger.info("PostZuulFilter refresh token now stored in HTTP ONLY cookie:");
            logger.info(refreshToken);

        }
        if (requestURI.contains("oauth/token") && requestMethod.equals("DELETE")) {
            final Cookie cookie = new Cookie("refreshToken", "");
            cookie.setMaxAge(0);
            cookie.setPath(ctx.getRequest().getContextPath() + "/oauth/token");
            ctx.getResponse().addCookie(cookie);
        }
        ctx.setResponseBody(responseBody);

    } catch (final IOException e) {
        logger.error("Error occured in zuul post filter", e);
    }
    return null;
}

@Override
public boolean shouldFilter() {
    return true;
}

@Override
public int filterOrder() {
    return 10;
}

@Override
public String filterType() {
    return "post";
}


private String decodeJwtToken(String jwtToken) {
    logger.info("------------ Decode JWT ------------");
    String[] split_string = jwtToken.split("\\.");
    String base64EncodedHeader = split_string[0];
    String base64EncodedBody = split_string[1];
    String base64EncodedSignature = split_string[2];

    logger.info("~~~~~~~~~ JWT Header ~~~~~~~");
    Base64 base64Url = new Base64(true);
    String header = new String(base64Url.decode(base64EncodedHeader));
    System.out.println("JWT Header : " + header);


    logger.info("~~~~~~~~~ JWT Body ~~~~~~~");
    String body = new String(base64Url.decode(base64EncodedBody));
    logger.info("JWT Body : "+body);

    return "";
}

} ​​

И, наконец, мой угловой сервисe request.

public obtainAccessToken(params: URLSearchParams): Observable<string> {                                                             
 console.log('obtainAccessToken');                                                                                              

 console.log('Getting access token from ', appConfig.tokenServerUrl);                                                           
 console.log('Using params: ');                                                                                                 
 console.dir(params.toString());                                                                                                


// Now fire the request                                                                                                         
this.http.post(                                                                                                                 
    'http://neptune.local.domain.org:8084/oauth/token',                                                                         
    params.toString(), {                                                                                                        
        headers: new HttpHeaders({                                                                                              
           'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'}),                                                
           withCredentials: true,                                                                                               
           observe: 'response'                                                                                                  
 })                                                                                                                             
  .pipe(map((response) => {                                                                                                                                                                             
    // Try and find the Set-Cookie header! (Good luck)                                                                          
    console.log(response);                                                                                                      
    console.log('response headers',response.headers.keys());                                                                    
    const respKeySet = response.headers.keys();                                                                                 
    for( let x = 0; x < respKeySet.length; x++ ) {                                                                              
     console.log('Key: %s, Value: %s',                                                                                          
       respKeySet[x],                                                                                                           
       response.headers.get(respKeySet[x]));                                                                                    
    }                                                                      

}));
}

Мой сервер и мой клиент работают на одной рабочей станции, я задал имя FQD.

Итак, Клиент работает.http://neptune.local.mydomain.org:4200

Мой сервер работает.http://neptune.local.mydomain.org:8084

Я никогда не получаю Set-Cookie в Chrome ???

Кто-нибудь знает почему?ЭМ, ПОМОГИТЕ ....

1 Ответ

0 голосов
/ 26 сентября 2018

Код в моем вопросе действительно работает.Запрос на обслуживание Angular никогда не отображает заголовок Set-Cookie.

Но ....

При повторной проверке после многочисленных изменений и остановок / перезапусков я сгенерировал другой запрос, но на консоль ничего не выводилось,Затем я проверил вкладку сети Google Chrome DevTools на запрос, который я отправил, и привет, он там.enter image description here Yaay !!!

...