title: token authentication using retrofit
body: <p>The scenario is that I have a login activity that sends username and passwords to the php-rest-api and if the response is ok it will show a new activity (here it is a test activity).</p>
  
  <p>Then, in the new activity, with a token that I got from the login procedure, I can query the database by retrofit.</p>
  
  <p>The problem is that I need to save cookies from the login attempt to use it in my next request.<br>
  I am using retrofit:2.2.0 and
     I read 
  <a href="https://stackoverflow.com/questions/22425993/how-to-retrieve-cookies-in-retrofit?noredirect=1&amp;lq=1" title="How to retrieve cookies in Retrofit?">How to retrieve cookies in Retrofit?</a> 
    and <a href="http://Retrofit%20keeps%20forgeting%20my%20cookies%20:(%20Android" rel="nofollow noreferrer">Retrofit keeps forgeting my cookies :( Android</a>
  and I checked all the possible solution.</p>
  
  <p>My app works, no error happens, but the header fields values in my first and second activity are different.</p>
  
  <p>This is my retrofit client:  </p>
  
  <pre><code>public class RetrofitClient {
  
      private static String BASE_URL = "http://192.168.0.100/rest/main.php/";
      private static Retrofit retrofit = null;
  
      public static Retrofit getRetroftInstance() {
          if (retrofit == null) {
  
              OkHttpClient cl = new OkHttpClient().newBuilder().addInterceptor(new AuthInterceptor()).build();
  
              retrofit = new Retrofit.Builder()
                      .baseUrl(BASE_URL)
                      .addConverterFactory(GsonConverterFactory.create())
                     // .client(client)
                      .build();
          }
  
          return retrofit;
      }}
  </code></pre>
  
  <p>This is authenticationinceptor:<br>
  <code>public class AuthInterceptor
          implements Interceptor {
      @Override
      public Response intercept(Chain chain)
              throws IOException {
          Request request = chain.request();
          request = request.newBuilder()
                  .addHeader("X-XSRF-TOKEN", ServiceSharedPrefs.getInstance().getToken())
                  .build();
          Response response = chain.proceed(request);
          return response;
      }
  }</code></p>
  
  <p>This is my login procedure:  </p>
  
  <pre><code>private void loginProcedure(final String username, final String password) {
      //Creat a user base on the user input
      UserDB user = new UserDB(username, password);
      //send data to the api and get response
      Call&lt;ApiDB&gt; call = retrofitInterfaceObject.checkCredentials(user);
      call.enqueue(new Callback&lt;ApiDB&gt;() {
          @Override
          public void onResponse(Call&lt;ApiDB&gt; call, Response&lt;ApiDB&gt; response) {
              //Unauthorized handling
              if (response.code() == 401) {
                  Toast.makeText(LoginActivity.this, "in 401", Toast.LENGTH_SHORT).show();
                  ServiceDialog
                          .getInstance()
                          .CreateDialog(LoginActivity.this,
                                  String.valueOf(response.code())
                                          + LoginActivity.this.getString(R.string.login_unauthorized_error_title)
                                  , LoginActivity.this.getString(R.string.login_unauthorized_error_message)
                                  , LoginActivity.this.getString(R.string.Generall_Ok_Text), null, null, null, false, false);
              }
              //Handling the 200 response : 2 possibility
              else if (response.code() == 200) {
                  //if login ok
                  if (response.body().getLogin() != null) {
                      if (response.body().getLogin().contains("yes")) {
                          for(int i =0 ;i &lt; response.headers().size();i++){
                              Log.v("mmmm login header:"+i,response.headers().name(i));
                          }
                          sharedPrefs.setToken(response.headers().get("X-XSRF-TOKEN"));
                          sharedPrefs.saveData(username, password);
                          LoginActivity.this.startActivity(new Intent(LoginActivity.this, test_check.class));
                      }
  
                  }
                  //if login not ok
                  else if (response.body().getError().contains("Error in authentication!")) {
                      ServiceDialog
                              .getInstance()
                              .CreateDialog(LoginActivity.this, LoginActivity.this.getString(R.string.login_credentials_error_title)
                                      , LoginActivity.this.getString(R.string.login_credentials_error_message)
                                      , LoginActivity.this.getString(R.string.Generall_Ok_Text), null, null, null, false, false);
                  }
              }
              //Handle other situations
              else {
                  ServiceDialog
                          .getInstance()
                          .CreateDialog(LoginActivity.this, response.code() + " : " + LoginActivity.this.getString(R.string.login_null_error_title)
                                  , LoginActivity.this.getString(R.string.login_null_error_message)
                                  , LoginActivity.this.getString(R.string.Generall_Ok_Text), null, null, null, false, false);
              }
          }
  
          @Override
          public void onFailure(Call&lt;ApiDB&gt; call, Throwable t) {
              ServiceDialog.getInstance().CreateDialog(LoginActivity.this, LoginActivity.this.getString(R.string.login_null_error_title)
                      , t.getMessage() + "\n" + t.getLocalizedMessage(), LoginActivity.this.getString(R.string.Generall_Ok_Text),
                      null, null, null, true, true);
          }
      });
  </code></pre>
  
  <p>This is my test activity:  </p>
  
  <pre><code>protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_test_check);
      final TextView t = (TextView) findViewById(R.id.txviewtest);
  
      //t.setText(ping("192.168.0.100"));
  
  
      Call&lt;UserDB&gt; call = this.ret.get1(ServiceSharedPrefs.getInstance().getToken());
      call.enqueue(new Callback&lt;UserDB&gt;() {
          @Override
          public void onResponse(Call&lt;UserDB&gt; call, Response&lt;UserDB&gt; response) {
              for(int i =0 ;i &lt; response.headers().size();i++){
                  Log.v("mmmm check header:"+i,response.headers().name(i));
              }
              t.append(ServiceSharedPrefs.getInstance().getToken());
              t.append("\n");
              t.append(String.valueOf(response.code()));
              t.append("\n");
              t.append(response.headers().toString());
              t.append("\n");
  
              t.append(response.body().toString());
  
          }
          @Override
          public void onFailure(Call&lt;UserDB&gt; call, Throwable t) {
              ServiceDialog.getInstance().CreateDialog(test_check.this, t.getMessage(),
                      null, getString(R.string.Generall_Ok_Text), null, null, null, true, true);
          }
      });
  </code></pre>
  
  <p>my first header :</p>
  
  <p><code>login header:0: Date:Thu, 18 May 2017 08:10:50 GMT
  login header:1: Server:Apache/2.4.23 (Win64) PHP/5.6.25
  login header:2: X-Powered-By:PHP/5.6.25
  login header:3: Set-Cookie:XSRF-TOKEN=N18743296; path=/
  login header:4: Expires:Thu, 19 Nov 1981 08:52:00 GMT
  login header:5: Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  login header:6: Pragma:no-cache
  login header:7: Set-Cookie:XSRF-TOKEN=N18743296; path=/
  login header:8: Set-Cookie:XSRF-TOKEN=N18743296; path=/
  login header:9: X-XSRF-TOKEN:N18743296
  login header:10: Content-Length:15
  login header:11: Keep-Alive:timeout=5, max=100
  login header:12: Connection:Keep-Alive
  login header:13: Content-Type:text/html; charset=UTF-8</code></p>
  
  <p>my second header :  </p>
  
  <p><code>second header:0: Date:Thu, 18 May 2017 08:10:50 GMT
  second header:1: Server:Apache/2.4.23 (Win64) PHP/5.6.25
  second header:2: X-Powered-By:PHP/5.6.25
  second header:3: Set-Cookie:PHPSESSID=8ol17tht32l24fblejn2mjm9d4; path=/; HttpOnly
  second header:4: Expires:Thu, 19 Nov 1981 08:52:00 GMT
  second header:5: Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  second header:6: Pragma:no-cache
  second header:7: Content-Length:154
  second header:8: Keep-Alive:timeout=5, max=99
  second header:9: Connection:Keep-Alive
  second header:10: Content-Type:application/json; charset=utf-8</code></p>