2016-10-04 3 views
1

Я создаю приложение, которое требует от меня использования Native Android Activities и React Native для Android. Я делаю запросы на сервер, чтобы авторизовать себя и получать ресурсы в своей активности Android с помощью файлов cookie. Я хотел бы использовать эти же куки внутри моей активной активности React.Поделиться куки между React Native Activity и Native Activity Android с помощью Cookie Jar

В моей деятельности Android я использую клиент OkHTTP3 для обработки запросов и обработки файлов cookie. Эта библиотека имеет полезный класс CookieJar, который обрабатывает хранение и отправку файлов cookie для меня.

В моем действии React. Я использую fetch для запросов, которые используют OkHTTP под капотом. Есть ли способ для меня получить доступ к моему постоянному Cookie Jar через код Javascript, чтобы у меня было постоянное сохранение файлов cookie между обоими действиями.

Я понимаю, что решением будет использование моста и создание моего собственного класса Java, который завершает мой AuthClient в доступный Javascript, но это решение не совсем то, что я хочу.

Этот класс является Android активность

public class AndroidActivity extends AppCompatActivity { 

    private Button switchToReactButton; 
    private Button loginButton; 
    private Button getFeedButton; 
    private EditText usernameEditText; 
    private EditText passwordEditText; 
    private OkHttpClient mOkHttpClient; 
    private AuthClient mHttpClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_native); 
     switchToReactButton = (Button) findViewById(R.id.switchToReactButton); 
     getFeedButton = (Button) findViewById(R.id.getFeedButton); 
     usernameEditText = (EditText) findViewById(R.id.usernameEditText); 
     passwordEditText = (EditText) findViewById(R.id.passwordEditText); 
     loginButton = (Button) findViewById(R.id.loginButton); 

     mOkHttpClient = new OkHttpClient.Builder() 
       .addNetworkInterceptor(new LoggingInterceptor()) 
       .cookieJar(new MyCookieManager()) 
       .build(); 
     mHttpClient = new AuthClient(mOkHttpClient); 

     switchToReactButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(AndroidActivity.this, ReactNativeActivity.class); 
       startActivity(intent); 
      } 
     }); 

     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String username = usernameEditText.getText().toString(); 
       String password = passwordEditText.getText().toString(); 

       try { 
        mHttpClient.doAuth(username, password); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     getFeedButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        mHttpClient.getFeed(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

Этот класс является AuthClient

public class AuthClient { 

    private String username; 
    private String password; 
    OkHttpClient client; 

    public AuthClient(OkHttpClient client) 
    { 
     this.client = client; 
    } 

    public void doAuth(String username, String password) throws Exception { 
     this.username = username; 
     this.password = password; 
     Object TAG_CALL = new Object(); 
     Request getRequest = new Request.Builder() 
       .url("https://mywebsite.com/suite/") 
       .tag(TAG_CALL) 
       .build(); 
     getAuthCookies(getRequest); 
    } 

    private void getAuthCookies(Request request) { 
     client.newCall(request).enqueue(new Callback() { 
      @Override public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override public void onResponse(Call call, Response response) throws IOException { 
       if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
       postAuth(); 
      } 
     }); 
    } 

    private void postAuth() throws IOException { 
     MediaType JSON = MediaType.parse("application/x-www-form-urlencoded"); 

     HttpUrl url = HttpUrl.parse("https://mywebsite.com/suite/auth"); 
     List<Cookie> cookies = client.cookieJar().loadForRequest(url); 

     String json = "un="+username+"&pw="+password+"&_spring_security_remember_me=on&X-TOKEN=" 
       + cookies.get(1).value(); 

     Request request = new Request.Builder() 
       .url(url) 
       .post(RequestBody.create(JSON, json)) 
       .addHeader("Accept", "text/html") 
       .addHeader("Accept-Language", "en_US") 
       .addHeader("Cookie2", "$Version=1") 
       .build(); 

     Response response = client.newCall(request).execute(); 
     if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
    } 

    public void getFeed() { 

     HttpUrl url = HttpUrl.parse("https://mywebsite.com/suite/api/feed/"); 
     List<Cookie> cookies = client.cookieJar().loadForRequest(url); 

     Request getRequest = new Request.Builder() 
       .url(url) 
       .addHeader("Accept", "application/xml, text/xml, text/html, application/*+xml, application/atom+xml") 
       .addHeader("Accept-Language", "en_US") 
       .addHeader("Cookie2", "$Version=1") 
       .build(); 

     client.newCall(getRequest).enqueue(new Callback() { 
      @Override public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override public void onResponse(Call call, Response response) throws IOException { 
       if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
       Log.i("NATIVE", "feed: " + response.body()); 
      } 
     }); 
    } 
} 

ответ

1

Решение просто использовать клиент OkHTTP, который создается React Native NetworkingModule. Этот клиент сохраняется через приложение и имеет свой собственный CookieJar. Использование fetch в javascript использует этот клиент и может получать и устанавливать файлы cookie. Если мы просто используем этот же экземпляр клиента для запросов в Native Java-коде, все работает отлично.

mHttpClient = new AuthClient(OkHttpClientProvider.getOkHttpClient());