#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
- Вход пользователя с помощью firebase sdk.
-
Я прикрепляю токен в качестве заголовка в модифицированном перехватчике 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()); } }
}
-
Мой сервер узла проверяет токен id, и отправляется ответ, если токен id действителен, иначе сообщение об ошибке.
Проверьте предупреждение на странице:
Методы проверки токенов ID, включенные в пакеты SDK администратора Firebase, предназначены для проверки токенов ID, которые поступают из клиентских пакетов SDK, а не пользовательских токенов, которые вы создаете с помощью пакетов SDK администратора.
Надеюсь, это поможет!!