Как решить проблему аутентификации API в приложении Kotlin Android? - PullRequest
0 голосов
/ 26 января 2020

Я разработал API в Laravel для чтения некоторых данных с аутентификацией. Теперь в моем приложении мне нужно отправить токен в своем заголовке для ответа API. Каждый раз, когда я вхожу в приложение, я получаю токен без проблем, но я не могу предоставить токен в заголовке, и он возвращает нулевой ответ токена. Теперь каждый раз, когда я снова открываю свое приложение, все в порядке, но проблема появляется только при входе в систему.

Пожалуйста, прочитайте мой код и скажите, если вы нашли ошибку.

Это мой (AppServer.kt) , Я использую это для добавления токена в мой заголовок

    class AppServer private constructor(private val client: INetworkClient) : IAppServer {

      private val gson = Gson()

      companion object {
        private var instance: AppServer? = null
        fun getInstance(): AppServer {
          val token = AppLoggedInUser.getInstance()?.userProfile?.userToken ?: ""

          if (instance == null)
            instance = AppServer(
              MixedNetworkClient(
                mHeaders = mutableMapOf(
                  Headers.CONTENT_TYPE to "application/json",
                  "X-Requested-With" to "XMLHttpRequest",
                  "Authorization" to "Bearer $token"
                ),
                mBasePath = "https://myWebsiteURL.com/"

              )
            )
          return instance!!
        }
      }

      override fun getPurchasedItems(): Observable<Pair<ResponseState, List<OrderInfo>?>> {
        return Observable.create<Pair<ResponseState, List<OrderInfo>?>> { emitter ->

          val (items, statusCode, msg, error) =
            client.get(
              "api/users/${AppLoggedInUser.getInstance().userProfile.userId}/orders",
              { responseStr ->
                try {

                  val orders = mutableListOf<OrderInfo>()
                  val jArray = JSONArray(responseStr)
                  for (i in 0 until jArray.length()) {
                    val jObject = jArray.getJSONObject(i)
                    val order =
                      gson.fromJson<OrderInfo>(jObject.toString(), OrderInfo::class.java)

                    if (order.isPaymentSuccessful)
                      orders.add(order)
                  }
                  if (orders.isEmpty())
                    emitter.onNext(pair(empty(), null))
                  else
                    emitter.onNext(pair(success(), orders))

                } catch (t: Throwable) {
                  Timber.e(t)
                  emitter.onNext(pair(ResponseState.internalError(t), null))
                }
              })
        }.attachSchedulers()
      }

      override fun getDiscountDetailsById(id: Int): Observable<Pair<ResponseState, DiscountDetails?>> {
        return Observable.create<Pair<ResponseState, DiscountDetails?>> { emitter ->
          try {
            client.post("api/post", listOf("post_id" to id.toString())) { responseStr ->
              val jObject = JSONObject(responseStr)
              var discount: DiscountDetails? = null
              if (jObject.has("ID"))
                discount =
                  gson.fromJson<DiscountDetails>(jObject.toString(), DiscountDetails::class.java)
              if (discount != null)
                emitter.onNext(pair(success(), discount))
              else
                emitter.onNext(pair(notFound404(), null))
            }
          } catch (t: Throwable) {
            Timber.e(t)
            emitter.onNext(pair(ResponseState.internalError(t), null))
          }
        }.attachSchedulers()
      }
    }

, и это мой (AppLoggedInUser. java). Я использую его для получения текущего токена пользователя.

package com.fartaak.gilantakhfif.utilities;

import android.content.Context;
import com.fartaak.gilantakhfif.backend.server.ParsingGSON;
import com.fartaak.gilantakhfif.model.UserProfile;

public class AppLoggedInUser extends AppPreferences {

  public static final String NAM_LOGIN_SdPs = "login";

  public static final String KEY_USER_TOKEN = "tokenPor";

  private static AppLoggedInUser mInstance;

  private final String KEY_LOGIN = "prefP";

  private boolean isCompletelyRegistered;


  public static void init(Context context) {
    if (mInstance == null) {
      mInstance = new AppLoggedInUser(context);
    }
  }

  public static AppLoggedInUser getInstance() {
    if (mInstance != null) {
      return mInstance;
    } else {
      throw new IllegalStateException(
          "you should call init to initialize only once per app launch before calling getInstance");
    }
  }

  private AppLoggedInUser(Context context) {
    super(NAM_LOGIN_SdPs, context);
  }

    public String getUserToken() {
        return getField(KEY_USER_TOKEN);
    }


  public void clearUserProfile() {
    removeField(KEY_LOGIN);
  }

  public UserProfile getUserProfile() {
    String data = getField(KEY_LOGIN);
    if (data == null) {
      return null;
    }
    //return new Gson().fromJson(data, UserProfile.class);
    return ParsingGSON.getInstance().getParsingJSONObject(data, UserProfile.class, null);
  }

  public boolean isRegisterCompleted() {
    if (!isCompletelyRegistered) {
      UserProfile userProfile = getUserProfile();
      if (userProfile.getUserName() == null) {
        return false;
      } else {
        isCompletelyRegistered = true;
      }
    }
    return true;
  }

  public boolean isUserProfile() {
    return isField(KEY_LOGIN);
  }

  public void setUserProfile(UserProfile userProfile) {
    String json = ParsingGSON.getInstance().toJSONObject(userProfile, UserProfile.class, null);
    setField(KEY_LOGIN, json);
  }
}

I думаю, проблема в моем втором классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...