Получите идентификатор в Android-приложении и проверьте его на сервере backend (как использовать токен?)

Я разрабатываю приложение для Android, которое потребляет данные с моего собственного сервера REST API. Я хочу использовать Firebase-аутентификацию, потому что она позволяет пользователю войти в систему с помощью Google, Facebook, Twitter... очень простым способом.

Но я не уверен, как использовать токены ID:

  • Поскольку идентификаторы токенов имеют дату истечения срока действия, я должен вызвать метод getToken для каждого запроса в клиентском приложении, поэтому я уверен, что каждый раз отправляю действительный токен?
  • Должен ли я вызвать verifyIdToken на сервере каждый раз, когда я получаю запрос от клиентского приложения?

Я не знаю, что делают эти методы (getToken и verifyIdToken) под капотом, и потому что они асинхронны, я боюсь, что они делают запрос на серверы Firebase при каждом вызове. Поэтому я думаю, что сделать 2 запроса серверам Firebase в каждом из моих запросов - это не путь...

Ответ 1

Оба метода getToken() и VerifyIdToken() предназначены для вызова для каждого исходящего/входящего запроса.

1) Хотя getToken() является асинхронным, Firebase Android SDK фактически кэширует текущий токен Firebase в локальном хранилище. Пока кешированный токен все еще действителен (т.е. В течение одного часа с момента выпуска), getToken() немедленно возвращает токен. Только когда истекает срок действия кэшированного токена, SDK извлекает новый токен с удаленного сервера Firebase.

2) VerifyIdToken() также оптимизирован для производительности. Он кэширует публичный сертификат токена Firebase (действительный в течение 6 часов), который используется для проверки подписи маркера на локальном компьютере. Нет RPC, кроме загрузки публичного сертификата.

Ответ 2

Вы обновляете токен каждый раз, когда он недействителен. И да, вы должны проверять токен на серверной стороне каждый раз. Если значение недействительно, вы отправляете код ошибки 401 с сообщением об ошибке (если хотите). Проверка токена используется при обновлении токена, а токен добавляется к каждому запросу. Если вы используете OkHttp, вы можете создать перехватчик, который добавляет токен в заголовке для каждого запроса, а также может обновлять токен, когда код ошибки равен 401.

Ответ 3

POST https://YOUR_AUTH0_DOMAIN/delegation
Content-Type: 'application/json'
{
  "client_id":       "YOUR_CLIENT_ID",
  "grant_type":      "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token":   "your_refresh_token",
  "api_type":        "app"
}

Ответ 4

Из того, что вы объяснили в вопросе, я предполагаю, что вы говорите о доступе к ресурсам кросс-клиента с помощью входа в Google. И, в частности, вы, похоже, заинтересованы в получении идентификационного знака один раз и используете его, не получая при каждом последующем Вызов API.

Это более или менее синоним механизма автономного доступа. В автономном доступе клиент I.e. приложение Android запрашивает авторизацию пользователя для запрашиваемых областей. После авторизации вместо выдачи токена доступа сервер auth возвращает короткий код авторизации, который может использоваться для создания токена доступа и обновления токена.

Затем клиент может передать код авторизации на бэкэнд через безопасное соединение. Сервер backend может извлекать токен автора и обновлять токен и хранить их в безопасном месте. Маркер доступа недолговечен и может быть использован для быстрого доступа к облачным ресурсам и обновляется время от времени с помощью токена обновления. Ток обновления не истекает, но может быть отменен. При аннулировании серверное приложение должно попросить клиентское приложение повторно выбрать код автора.

Пройдите по этой ссылке, в которой подробно описывается полная инфраструктура, а также шаги, которые должны выполняться как клиентским, так и серверным приложением - https://developers.google.com/identity/protocols/CrossClientAuth

Теперь, придя к вашему вопросу, вы должны использовать несколько иной API для получения кода auth. Проверьте этот API - https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestServerAuthCode(java.lang.String)

Пример кода при - https://developers.google.com/identity/sign-in/android/offline-access

Ответ 5

Используйте нижеприведенный код в своем классе приложения, а regId - это значение для вашего токена устройства.

private void checkPlayService() {
    // Check device for Play Services APK. If check succeeds, proceed with
    // GCM registration.
    if (checkPlayServices()) {
     GoogleCloudMessaging googleCloudMessaging = GoogleCloudMessaging.getInstance(activity);
        regId = getRegistrationId();

        if (TextUtils.isEmpty(regId)) {
            registerInBackground();
        }
    } else {
        Log.i(TAG, "No valid Google Play Services APK found.");
    }
}

private String getRegistrationId() {
    String registrationId = sp.getString(Consts.PROPERTY_REG_ID, "");
    if (TextUtils.isEmpty(registrationId)) {
        Log.i(TAG, "Registration not found.");
        return "";
    }
    // Check if app was updated; if so, it must clear the registration ID
    // since the existing regID is not guaranteed to work with the new
    // app version.
    int registeredVersion = sp.getInt(PROPERTY_APP_VERSION,0);
    int currentVersion = getAppVersion();
    if (registeredVersion != currentVersion) {
        Log.i(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private void registerInBackground() {
    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String msg = "";
            try {
                if (googleCloudMessaging == null) {
                    googleCloudMessaging = GoogleCloudMessaging.getInstance(activity);
                }

                regId = googleCloudMessaging.register(Consts.PROJECT_NUMBER);
                msg = "Device registered, registration ID=" + regId;
                Log.e("GCMID",msg);
                storeRegistrationId(regId);

            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return msg;
        }

        @Override
        protected void onPostExecute(String msg) {
            Log.i(TAG, msg + "\n");
        }
    }.execute(null, null, null);
}



private void storeRegistrationId(String regId) {
    int appVersion = getAppVersion();
    Log.i(TAG, "Saving regId on app version " + appVersion);
    sp.edit().putString(Consts.PROPERTY_REG_ID, regId).commit();
    sp.edit().putInt(PROPERTY_APP_VERSION, appVersion).commit();
}