Аутентификация Android с помощью аутентификации firebase и отправки токена для проверки в серверную часть Django

#android #django #firebase #firebase-authentication

#Android #django #firebase #firebase-аутентификация

Вопрос:

Проблема, которую я рассмотрю здесь, довольно распространенная, меня беспокоит одна ее часть, которую я выделю:

Мое приложение для Android проверяет подлинность пользователей с помощью аутентификации firebase (либо создать, либо проверить, что существует), а затем вызывает различные API-интерфейсы на моем сервере django. Для вызова API мне нужно отправлять токен в каждом запросе, чтобы предотвратить несанкционированные запросы.

Я планировал сначала использовать аутентификацию Django, но поскольку я использую аутентификацию firebase, я думаю о следующем подходе:

Когда пользователь выполняет вход или вход на устройство Android. Android сгенерирует пользовательский токен (из firebase), сохранит его на телефоне, а затем отправит его в каждом API на серверную часть. В серверной части я буду использовать firebase API для получения пользователя из firebase (в первый раз) и сохранения токена в моей модели пользователей. Если токен не найден в моей базе данных и недоступен в firebase, я возвращаю неавторизованного пользователя. Для последующих запросов я проверяю токен с помощью моей локальной таблицы пользователей.

Пожалуйста, сообщите, является ли этот подход лучшим в данном случае.

Спасибо

Ответ №1:

Я не могу комментировать ваш подход. Но даже я хочу знать наилучший подход. Вот как я это делаю, используя информацию, представленную на этой странице verify-id-tokens

  1. Вход пользователя с помощью firebase sdk.
  2. Я прикрепляю токен в качестве заголовка в модифицированном перехватчике HTTP-вызовов. Теперь токен id действителен только в течение 15-20 минут, поэтому вы не можете их сохранить. Просто используйте приведенный ниже код, чтобы добавить перехватчик в модифицированный HTTP-вызов

     public class FirebaseUserIdTokenInterceptor implements Interceptor {
    
    // Custom header for passing ID token in request.
    private static final String X_FIREBASE_ID_TOKEN = "Authorization";
    
    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Request request = chain.request();
    
        try {
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            if (user == null) {
                throw new Exception("User is not logged in.");
            } else {
                Task<GetTokenResult> task = user.getIdToken(true);
                GetTokenResult tokenResult = Tasks.await(task);
                String idToken = tokenResult.getToken();
    
                if (idToken == null) {
                    throw new Exception("idToken is null");
                } else {
                    Request modifiedRequest = request.newBuilder()
                            .addHeader(X_FIREBASE_ID_TOKEN, "Bearer ".concat(idToken))
                            .build();
                    return chain.proceed(modifiedRequest);
                }
            }
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }
      

    }

  3. Мой сервер узла проверяет токен id, и отправляется ответ, если токен id действителен, иначе сообщение об ошибке.

Проверьте предупреждение на странице:

Методы проверки токенов ID, включенные в пакеты SDK администратора Firebase, предназначены для проверки токенов ID, которые поступают из клиентских пакетов SDK, а не пользовательских токенов, которые вы создаете с помощью пакетов SDK администратора.

Надеюсь, это поможет!!