2017-10-12 13 views
2

J'essaie d'ajouter un cookie d'authentification enregistré à d'autres demandes en utilisant un CookieJar. Et tout en obtenant un cookie d'authentification correct et en l'enregistrant dans le pot fonctionne très bien, lors de l'inspection du response.request().headers(), le cookie est introuvable.OkHttp CookieJar ne parvient pas à ajouter un cookie à la demande

J'ai trouvé ceci particulièrement étrange puisque j'ai découvert par le débogage que loadForRequest() est appelé pour la demande et renvoie ce cookie correct. Lorsque vous utilisez exactement ce même cookie dans Postman pour simuler la requête, il renvoie le résultat souhaité (une page sans formulaire de connexion).

Quelqu'un pourrait-il essayer d'expliquer ce qui me manque?

classe où le pot est utilisé

class HTMLRoutes { 
    var scheme = "https" 
    var host = "www.mangaupdates.com" 
    val cookieJar = MULoginCookieJar() 
    var client = OkHttpClient.Builder() 
      .cookieJar(cookieJar) 
      .build() 
/*Other code*/ 

private fun getHTMLFromUrl(url: HttpUrl): String { 
     var request = Request.Builder() 
       .url(url) 
       .build() 
     client.newCall(request).execute().use { response -> 
     //Right before returning response the loadForRequest() method gets called in the MUCookieJar class 
      if (response.isSuccessful) { 
      //response.request.headers = "" 
       if (response.body() != null) { 
        return response.body()!!.string() 
       } else { 
        throw IOException("Response body is empty") 
       } 
      } else { 
       throw IOException("Unexpected code" + response) 
      } 
     } 
    } 
} 

Mon cookiejar

class MULoginCookieJar : CookieJar { 
    private var secureSessionCookie: Cookie? = null 

    override fun saveFromResponse(url: HttpUrl?, cookies: MutableList<Cookie>?) { 
     if (url != null && cookies != null) { 
      if (url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") { 
       for (cookie in cookies) { 
        if(cookie.name() == "secure_session") { 
         secureSessionCookie = cookie 
        } 
       } 
      } 
     } 
    } 

    override fun loadForRequest(url: HttpUrl?): List<Cookie>? { // url = https://www.mangaupdates.com/series.html?id=14829 
     if(url != null && url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") { 
      return emptyList() 
     } 

     val cookies: List<Cookie> = if(secureSessionCookie==null) emptyList() else listOf(secureSessionCookie!!) 
     return cookies // = ["secure_session=601bbc74; expires=Sun, 07 Oct 2018 20:45:24 GMT; domain=www.mangaupdates.com; path=/; secure; httponly"] 
    } 
} 

aide est extrêmement apprécié. Je suis un lurker depuis longtemps, mais c'est la première fois que je suis tombé sur un problème.

+0

Que faites-vous pour vérifier que le cookie n'est pas envoyé? Notez qu'en fonction de votre configuration, un intercepteur peut s'exécuter avant que les cookies ne soient ajoutés à la requête. –

+0

@Jesse Wilson Lors du débogage juste après que la réponse a été renvoyée dans 'client.newCall (request) .execute()., Utilisez {response ->', la réponse OkHttp stockée dans 'response' a une chaîne vide pour' response. request.headers'. Je ne sais pas si c'est une façon définitive d'assurer que le cookie n'a pas été envoyé mais je pense qu'il devrait y avoir un Set-Cookie ....... dans les en-têtes si le cookie a été envoyé? Je n'ai pas non plus d'Interceptor dans ma mise en œuvre. Suggérez-vous d'en ajouter un? –

+0

Idem pour response.networkResponse(). Request()? –

Répondre

0

Je vous recommande d'utiliser un cookie existant au lieu de créer le vôtre. Les règles entourant les cookies peuvent devenir complexes.

import okhttp3.JavaNetCookieJar; 

CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); 

OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build(); 

Pour faciliter le débogage, vous pouvez configurer OkHttp debug logging with an interceptor.

Logger logger = LoggerFactory.getLogger(HttpUtil.class); 
HttpLoggingInterceptor logging = 
    new HttpLoggingInterceptor((msg) -> { 
     logger.debug(msg); 
    }); 
logging.setLevel(Level.BODY); 

client.addNetworkInterceptor(logging);