Top.Mail.Ru
Авторизация без SDK для Android | VK ID - сервис авторизации
VK ID auth service logo

Авторизация без SDK для Android

Важно. Если вы интегрируете VK ID без SDK, способы авторизации по One Tap, с помощью шторки авторизации или через 3 в 1 будут недоступны.
Не рекомендуем использовать подключение авторизации VK ID через открытие WebView — в этом случае авторизация может работать некорректно. Вместо него используйте подключение авторизации через открытие в браузере, о котором рассказывается в этой статье, или с помощью SDK. Перед настройкой авторизации убедитесь, что в кабинете сервиса авторизации VK ID приложение создано и настроено. Чтобы подключить авторизацию VK ID в приложении:
  1. Настройте подключение по ссылке.
  2. Получите код авторизации с помощью «перехватывания» редиректа.
  3. Обменяйте код на токен.
Когда будете создавать UI своего приложения, убедитесь что кнопка входа через VK ID соответствует требованиям к дизайну.

Шаг 1. Настройка подключения по ссылке

Сформируйте ссылку, по которой будет открываться авторизация. На базе Proof Key for Code Exchange (PKCE) реализуйте безопасное получение кода авторизации. Для тестирования рекомендуем генерировать code_verifier и code_challenge с помощью сервиса Online PKCE Generator Tool. Пример кода
val url = "https://id.vk.ru/authorize?state=abracadabra&response_type=code&code_challenge=6XoNqqytkpAhtthzJ77D8MvXfgje6syBEfmp6WjMENs&code_challenge_method=S256&client_id=7915193&redirect_uri=VKIDRedirectScheme://VKIDRedirectHost/blank.html?oauth2_params=base64(scope="email phone")&lang_id=3&scheme=space_gray"

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent)

Описание параметров

НазваниеОписание
client_idИдентификатор вашего приложения (вместо 7915193)
code_challengeЗначение code_verifier, преобразованное с помощью code_challenge_method и закодированное в base64. Порядок преобразований: BASE64-ENCODE(SHA256(codeVerifier)) RFC-7636 Code Challenge
code_challenge_methodМетод шифрования для генерации code_challenge на основе code_verifier. В нашем случае это S256
redirect_uriАдрес, куда будет перенаправлен пользователь после авторизации. Должен быть в формате VKIDRedirectScheme://VKIDRedirectHost/blank.html?oauth2_params=base64(scope="email phone"), где VKIDRedirectScheme и VKIDRedirectHost — значения параметров android:scheme и android:host, которые указываются на шаге 2 в AndroidManifest.xml, а oauth2_params — параметр scope, закодированный в base64, в котором через пробел переданы права доступа и которые будут запрошены у пользователя. Если scope пустой, то берётся минимальное значение прав доступа по умолчанию для приложений — vkid.personal_info. В примере выше мы указали доступы к email, phone
response_typeТип ответа авторизации. В нашем случае равен code
stateПроизвольная строка состояния приложения. Проверяется на втором шаге
lang_idЯзык интерфейса. По умолчанию используется значение 0 (русский язык). Возможные значения: RUS = 0,UKR = 1,ENG = 3,SPA = 4,GERMAN = 6,POL = 15,FRA = 16,TURKEY = 82
schemeТема формы запроса разрешений доступов пользователя. По умолчанию используется значение bright_light (дневная тема). Возможные значения: bright_light, space_gray

Шаг 2. «Перехватывание» редиректа

В AndroidManifest.xml объявите компонент Activity. С помощью него после авторизации вы «перехватите» редирект на redirect_uri, который указан на первом шаге.
<activity android:name=".AuthActivity">
  // ...
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />

  <data
      android:scheme="vk7915193" // Идентификатор вашего приложения, в данном случае, например, это vk7915193.
      android:host="vk.ru" // Данные из личного кабинета.
  />
</activity>
Также объявите сам класс:
class AuthActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
    }
    override fun onNewIntent(intent: Intent?) {
        // ...
    }
}
В onCreate() у созданного Activity обработайте входящую ссылку в поле intent.data. После «перехватывания» редиректа ваш сервис получит URI с query-параметрами code, state, device_id. Проверьте, что полученный state совпадает с тем, который вы создали на первом шаге — так вы сможете проверить валидность запроса. В случае несовпадения значений ответ можно считать подменённым. Пример кода
// vk7915193://vk.ru?payload:
{
  "device_id": "{string}",
  "code": "{string}",
  "state": "{string}",
  "type": "code_v2",
}
Полученный параметр device_id нужно сохранить и использовать во всех последующих запросах.

Шаг 3. Получение Access token

Обменяйте code на access_token с помощью HTTP-запроса.

Пример запроса

curl "https://id.vk.ru/oauth2/auth" -d "client_id=7915193&grant_type=authorization_code&code_verifier=KnHKAdqyW57MUbjRcScaZRU9Bw26Kez9zwBgti779zU&device_id=1111&code=1f06e0c317b5b524c6&redirect_uri=vk7915193://vk.ru/blank.html"

Описание параметров запроса

НазваниеОписание
grant_typeВсегда равно authorization_code
codeКод авторизации, полученный на втором шаге
code_verifiercode_verifier из первого шага
client_idИдентификатор приложения
device_idУникальный идентификатор вашего мобильного устройства, полученный на втором шаге
redirect_uriАдрес для редиректа после авторизации. Такой же, как на втором шаге
stateУникальная строка

Пример ответа

{
  "access_token": "XXXXX",
  "refresh_token": "XXXXX",
  "id_token": "XXXXX",
  "expires_in": 0,
  "user_id": 1234567890,
  "state": "XXX",
  "scope": "email phone"
}

Шаг 4. Получение нового Access token после истечения срока жизни предыдущего

Обменяйте refresh_token на access_token с помощью запроса HTTP-запроса.

Пример запроса

curl "https://id.vk.ru/oauth2/auth" -d "client_id=7915193&grant_type=authorization_code&code_verifier=KnHKAdqyW57MUbjRcScaZRU9Bw26Kez9zwBgti779zU&device_id=1111&code=1f06e0c317b5b524c6&redirect_uri=vk7915193://vk.ru/blank.html"

Описание параметров запроса

НазваниеОписание
grant_typeВсегда равно refresh_token
refresh_tokenrefresh_token, полученный на четвертом шаге
client_idИдентификатор приложения
device_idУникальный идентификатор вашего мобильного устройства, полученный на втором шаге
stateУникальная строка

Пример ответа

{
  "access_token": "XXXXX",
  "refresh_token": "XXXXX",
  "id_token": "XXXXX",
  "expires_in": 0,
  "user_id": 1234567890,
  "state": "XXX",
  "scope": "email phone"
}

Шаг 5. Инвалидация токена (выход из аккаунта)

В целях безопасности проинвалидируйте токен с помощью HTTP-запроса API, если вы хотите завершить сессию пользователя.

Пример запроса

curl "https://id.vk.ru/oauth2/logout" -d "client_id=7915193&device_id=1111&access_token=XXX"

Описание параметров запроса

НазваниеОписание
access_tokenaccess_token, полученный на четвертом шаге
client_idИдентификатор приложения
device_idУникальный идентификатор вашего мобильного устройства, полученный на втором шаге

Пример ответа

{"response":1}

Шаг 6. (Опционально) Получение пользовательских данных

Получите данные пользователя с помощью HTTP-запроса.

Пример запроса

curl "https://id.vk.ru/oauth2/user_info?client_id=7915193" -d "device_id=1111&acces_stoken=XXX"

Описание параметров запроса

НазваниеОписание
access_tokenaccess_token, полученный на четвертом шаге
client_idИдентификатор вашего приложения (вместо 7915193)
device_idУникальный идентификатор вашего мобильного устройства, полученный на втором шаге

Пример ответа

{
    "user": {
        "user_id": "1234567890",
        "first_name": "Ivan",
        "last_name": "Ivanov",
        "phone": "79991234567",
        "avatar": "https://pp.userapi.com/60tZWMo4SmwcploUVl9XEt8ufnTTvDUmQ6Bj1g/mmv1pcj63C4.png",
        "email": "ivan_i123@vk.ru",
        "sex": 2,
        "verified": false,
        "birthday": "01.01.2000"
    }
}

Шаг 7. (Опционально) Получение публичных пользовательских данных

Получите публичные маскированные данные пользователя с помощью HTTP-запроса.

Пример запроса

curl "https://id.vk.ru/oauth2/public_info" -d "client_id=7915193&id_token=XXX"

Описание параметров запроса

НазваниеОписание
id_tokenid_token, полученный на четвертом шаге
client_idИдентификатор вашего приложения (вместо 7915193)

Пример ответа

{
    "user": {
        "user_id": "1234567890",
        "first_name": "Ivan",
        "last_name": "I.",
        "phone": "+42872 *** ** 29",
        "avatar": "https://pp.userapi.com/60tZWMo4SmwcploUVl9XEt8ufnTTvDUmQ6Bj1g/mmv1pcj63C4.png",
        "email": "iv***@vk.vom"
    }
}