Как правильно реализовать авторизацию на Android и backend?
Делаю приложение с возможностью авторизации с помощью ВК.
Может ли кто-то описать или поправить? Есть несколько моментов, которые не совсем непонятны.
На данный момент схема входа такая:
1. Пользователь в приложении жмёт "Войти с помощью VK"
2. После этого он подтверждает вход.
3. Далее с помощью библиотеки VK SDK в приложении, забираем данные (accessToken, expiresIn, userId, email, state).
4. Отправляем на backend POST запрос, с данными (accessToken, userId, email)
5. С помощью полученного accessToken, на беке пробуем получить профиль юзера вк (с помощью vk sdk), чтобы удостовериться в валидности токена. В случае валидного токена, создаем юзера в БД/проверяем существует ли юзер по полученному userId из профиля вк. В случае невалидного токена, backend выбрасывает какую-нибудь 401 Error.
А вот далее не совсем понятно что делать. На backend'е в БД имеются таблицы user и user_token.
Схема таблиц следующая: user: id, email user_token: id, user_id (связь к колонке id из таблицы user), accessToken, refreshToken, created_at, expires_in_access_token, expires_in_refresh_token.
Создаем accessToken и refreshToken для пользователя.
Определяем время жизни токена:
поля expires_in_access_token и expires_in_refresh_token являются timestamp, и имеют время жизни 1 и 30 дней соответственно.
Далее backend должен вернуть ответ, в формате json (accessToken, refreshToken, expiresInAccessToken, expiresInRefreshToken).
В приложении сохраняем все эти данные. Допустим в sharedPrefs или Room.
Если API ручка на сервере требует токен, то забираем его из приложения и отправляем его в запросе вместе с headers.
Backend проверяет токен в БД и либо отвечает успешно (200 OK) и возвращает контент пользователя, либо выбрасывает ошибку, что токен не валидный либо истекло его время жизни?
Потом приложение должно обработать ошибку, если такая имеется:
1. В случае невалидности токена, чистим в приложении access token и refresh токен и отправляем пользователя входить через вк по новой с самого начала?
2. В случае истечении жизни access токена, отправляем POST запрос с refresh токеном на backend и проверяем его валидность и что время жизни refreshToken'а еще не истекло. Если refreshToken протух, backend должен отправить ошибку об этом и отправляем пользователя входить через ВК по новой.
Если refreshToken живой, генерируем новую пару accessToken и refreshToken, предварительно затерев старую запись в БД? И далее возвращаем пользователю json с новыми данными (accessToken, refreshToken), сохраняем их в приложении.
Верен ли описанный процесс входа пользователя или где-то всё пошло не по плану и должно быть сделано иначе?
1. А правильно ли я понял, что если используется несколько устройств и происходит авторизация в приложении, то на каждом устройстве будет своя независимая пара access token и refresh token?
2. При протухании access token, мы делаем запрос с refresh token'ом на backend, чтоб получить свежий access token. В этом случае, в БД необходимо будет обновить существующую запись? (обновить значение access токена и оставить refresh token какой и был) либо же затереть всю запись целиком и сгенерировать новую пару access и refresh token?