Перейти к содержанию

Login with VKID🔗

Login with VKID

Login with VKID — это единая платформа для авторизации и регистрации пользователей в разных сервисах экосистемы VK.

Android sdk-fingerprint is incorrect

Если вы используете новый механизм подписи apk/bundle в GooglePlay, вам следует взять SHA1 из GooglePlay Console вашего проекта.

VKID min api level

VKID требует Android 5.0+ (Api level 21+).

Предварительная настройка🔗

Получение ключей и необходимых данных🔗

Прежде чем начать, необходимо завести приложение на сайте VK platform. После создания приложения вы получите уникальный идентификатор для вашего приложения (ID приложения) и защищённый ключ.

Настройка проекта🔗

Настройте ваш проект согласно документации VK platform.

Также, необходимо добавить Сервисный ключ доступа из VK platform в MRGS консоль вашего проекта -> Интеграция -> VK access token

Добавление Universal links, schemas в iOS

VKId требует, чтобы приложение поддерживало universal links, а также были прописаны нужные схемы в plist приложения. Про настройку Universal links можно посмотреть в документации VK, указанной выше, но при необходимости можно использовать домен MRGS для universal links, для этого поставьте задачу на проект MRGS, или обратитесь к нам в чате поддержки, и мы пропишем ваш bundleId в наш файл app-site-associstion. Ниже приведен пример кода для Unity для добавления нужных данных в приложение:

[PostProcessBuild]
public static void PostProcessBuild(BuildTarget target, string path)
{
    string plistPath = path + "/Info.plist";
    PlistDocument plist = new PlistDocument();
    plist.ReadFromString(File.ReadAllText(plistPath));
    PlistElementDict rootDict = plist.root;

    PlistElementArray schemesToOpen = rootDict.CreateArray("LSApplicationQueriesSchemes");
    schemesToOpen.AddString("vkauthorize-silent");

    // Adding URL-scheme
    PlistElementArray appSchemes = rootDict.CreateArray("CFBundleURLTypes");
    PlistElementDict appSchemesDict = appSchemes.AddDict();
    appSchemesDict.SetString("CFBundleURLName", "");
    PlistElementArray appSchemesArray = appSchemesDict.CreateArray("CFBundleURLSchemes");                
    appSchemesArray.AddString("vk<VKontakte_APP_ID>");

    File.WriteAllText(plistPath, plist.WriteToString());

    // Adding Universal Links
    var projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetGuid: projectTarget);
    projectManager.AddAssociatedDomains(new []
    {
        "applinks:mrgs.astrum.team" // Your domain or mrgs domain if universal links is made via mrgs
    });
    projectManager.WriteToFile();
}

Для iOS Native:

Для добавления схем в LSApplicationQueriesSchemes (для открытия других приложений) необходимо:

  • Зайдите в Info.plist вашего приложения
  • Добавьте новую строку с названием LSApplicationQueriesSchemes и типом данных array
  • Добавьте в созданный массив необходимые элементы (vkauthorize-silent)

Для добавления URL-схемы (для открытия Вашего приложения извне) необходимо:

  • Зайдите в Info.plist вашего приложения
  • Добавьте строку «URL types»
  • Разверните первый элемент («Item0»), добавьте строку «URL identifier» и добавьте значение с идентификатором своего приложения (например, com.company.appname).
  • Добавьте строку в первый элемент («item0») в «URL types» и назовите его «URL Schemes» и добавьте новый элемент (нужную URL-схему) в «URL Schemes»

Для добавления Universal Links capability, в XCode проекте во вкладке 'Signing & Capabilities' необходимо добавить 'Universal Links'

Добавление зависимостей🔗

  • Добавьте модуль MRGSAuthenticationVkId
Добавление в Unity проект (общая инструкция)
  • Добавьте VK репозиторий в ваш root gradle файл:
allprojects {
    repositories {
        // others
        maven { url "https://artifactory-external.vkpartner.ru/artifactory/superappkit-maven-public/" }
    }
}

Шаг 1. Добавьте источники

Для того, чтобы добавить MRGS в проект через Unity Package Manager (доступно с Unity 2018+) просто добавьте в файл Packages/manifest.json раздел scopedRegistries, добавив в него следующую запись:

{
    "dependencies": {
        ...
    },
    "scopedRegistries": [
            {
                "name": "MRGS",
                "url": "https://mrgs-nexus.my.games/repository/mrgs-uninty-plugins/",
                "scopes": [
                    "games.my.mrgs"
                ]
            }
    ]
}

Альтернативно, можно нажать Edit -> Project Settings -> Package Manager -> '+' in scoped registry section, и заполнить поля в соответствии с данными выше.

Шаг 2. Добавьте зависимость

  • Нажмите Window -> Package Manager -> select 'Packages: MyRegistries' from dropdown list, выберите пакет MRGSAuthenticationVKId из списка, затем нажмите "Install"
  • Импортируйте модуль: using MRGS;
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.authenticationvkid.unitypackage из скачанного архива.
  • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.authenticationvkid-<version>.tgz из скачанного архива.
  • Импортируйте модуль: using MRGS;
Добавление в iOS проект (общая инструкция)

Шаг 1. Добавьте зависимости

Через Package collection

  • В Xcode выберите File > Add Packages
  • Выберите «+» > "Add Swift Package Collection"
  • Вставьте URL: https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json
  • Выберите модуль MRGSAuthenticationVKId из "MRGS Package Collection".
  • Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/AuthenticationVKId".

Отдельными пакетами

  • В Xcode выберите File > Add Packages
  • В строке поиска в правом верхнем углу вставьте URL: https://mrgs-gitea.my.games/mrgs/mrgsauthenticationvkid-ios-sdk.git
  • Добавьте модуль в свой проект
  • Или вы можете вставить URL https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/AuthenticationVKId".

Шаг 2. Добавьте поддержку категорий ObjectiveC

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVKId; или #import <MRGSAuthenticationVKId/MRGSAuthenticationVKId.h>

Шаг 1. Добавьте источники

В вашем podfile добавьте источники в начало файла:

source 'https://github.com/CocoaPods/Specs.git' # For main repo
source 'https://mrgs-gitea.my.games/mrgs/cocoapods-specs.git'  # For MRGS repo

Шаг 2. Добавьте зависимости

В target добавьте последнюю версию MRGSAuthenticationVKId:

Чтобы добавить через subspecs:

target 'MyProject' do
    pod 'MRGS', '~> 5.0.0', :subspecs => ['AuthenticationVKId']
end

Для добавления через отдельные модули:

target 'MyProject' do
    pod 'MRGSAuthenticationVKId', '~> 5.0.0'
end

Чтобы добавить все модули mrgs:

target 'MyProject' do
    pod 'MRGS/AllKits', '~> 5.0.0'
end

Шаг 3. Установите зависимости

  • Выполните pod install (или pod install --repo-update если необходимо)
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVKId; или #import <MRGSAuthenticationVKId/MRGSAuthenticationVKId.h>

Шаг 1. Добавьте зависимости

Добавьте зависимость в ваш Cartfile:

binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSAuthenticationVKId/MRGSAuthenticationVKId.json" ~> 5.0.0

Шаг 2. Установите зависимости

  • Выполните carthage update --use-xcframeworks
  • Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationVKId; или #import <MRGSAuthenticationVKId/MRGSAuthenticationVKId.h>
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • Добавьте MRGSAuthenticationVKId.xcframework из скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSAuthenticationVKId.framework - fat framework старого вида)

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".

  • Импортируйте модуль в коде: @import MRGSAuthenticationVKId; или #import <MRGSAuthenticationVKId/MRGSAuthenticationVKId.h>
  • Также, вы можете добавить из архива файлы MRGServiceKit.h и module.modulemap в свой проект, либо в настройках проекта укажите путь до них в разделе Build Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл: @import MRGServiceKit;
Добавление в Android проект
  • Добавьте VK репозиторий в ваш root gradle фай:
allprojects {
    repositories {
        // others
        maven { url "https://artifactory-external.vkpartner.ru/artifactory/superappkit-maven-public/" }
    }
}
  • Добавьте зависимости в ваши Application gradle file.
dependencies {
    def mrgsVersion = "6.x.x"

    implementation "games.my.mrgs:authentication-vkid:$mrgsVersion"
}

Скопируйте файл MRGSAuthenticationVKId.aar в директорию libs вашего проекта. Добавьте необходимые зависимости в файл build.gradle

dependencies {
    //...
    implementation(name: 'MRGSAuthentication', ext:'aar')
    implementation(name: 'MRGSAuthenticationVKId', ext:'aar')

    implementation "com.vk:vksdk-pub:0.110-24426"
    implementation "com.vk:oauth-vk:0.110-24426"
}

VK авторизация

VKID не совместим с другой библиотекой для авторизации/регистрации в VK. Убедитесь что в сборку не попадают одновременно эти две библиотеки, или добавьте в ваш mainTemplate.gradle файл следующий скрипт, что бы исключить из компиляции старый вариант авторизации:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        // ... other dependencies
    }
    configurations.implementation {
        exclude group: 'com.vk', module: 'android-sdk-core'
    }

Настройка параметров MRGS🔗

Далее нужно передать VK project id и VK project secret в MRGS SDK. Для этого, при старте SDK MRGS необходимо добавить соответствующую настройку в параметрах внешних SDK:

using MRGS;

public class MasterController : MonoBehaviour
{
    void Awake()
    {
        // Setting up mrgs params
        // ...

        var modulesParams = new List<MRGSExternalSDKSettings>
        modulesParams.Add(new MRGSVKIdParams("<VK_PROJECT_ID>", "<VK_PROJECT_SECRET>"))
        // Setting up external sdk params
        // ...

        MRGService.Instance.Initialize(serviceParams, sdkParams)
    }
}
@import MRGService;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Setting up mrgs params
    // ...
    //Setting up external sdk params

    MRGSVKIdParams* vkIdLoginParams = [[MRGSVKIdParams alloc] initWithClientId:@"<VK_PROJECT_ID>" clientSecret:@"<VK_PROJECT_SECRET>"];

    NSArray *externalParams = @[ ..., vkIdLoginParams];
    [MRGService startWithServiceParams:<params> externalSDKParams:externalParams delegate:nil];
}

Android

Настройки VKID нужно указать в ресурсах андроид согласно документации VK platform.

Работа с MRGSAuthentication интерфейсом🔗

Для работы с Login with VKID воспользуйтесь классом MRGSAuthenticationVKId (MRGSVKId на Android). Обращаем внимание, что данный класс реализует основной интерфейс MRGSAuthentication, то есть имеет все методы этого интерфейса. Далее описана стандартная реализация интерфейса MRGSAuthentication:

Делегат🔗

Перед началом работы с API, необходимо установить и реализовать делегат, принимающий обратные вызовы:

// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationVKId.Instance.Delegate = this;

// Implementation
// The method that is called when the user has logged out of the social network remotely, or his session has ended.
public void OnAuthenticationProviderDidLogoutUser(MRGSAuthentication provider, MRGSAuthenticationUser user){
    Debug.Log("MRGSAuthentication<Unity> - OnAuthenticationProviderDidLogoutUser: " + user + "\nNetwork: " + provider.SocialId().ToString());
}
// Установка
[MRGSAuthenticationVKId sharedInstance].delegate = self;

//Реализация
// Метод, который вызывается, когда пользователь удаленно вышел из социальной сети, или его сессия закончилась.
- (void)authenticationProvider:(id<MRGSAuthentication>)provider didLogoutUser:(MRGSAuthenticationUser *)user{
    NSLog(@"User did logout: \n%@", user);
}
// Метод, который вызывается в случае необходимости отображения контроллера для авторизации пользователя.
- (void)shouldPresentAuthorizationController:(UIViewController *)viewController {
    UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
    [rootVC presentViewController:viewController animated:YES completion:nil];
}
import androidx.annotation.NonNull;

import games.my.mrgs.authentication.MRGSAuthentication.OnExternalLogoutListener;
import games.my.mrgs.authentication.vkid.MRGSVKId;

// Set a listener
MRGSVKId.getInstance().setOnExternalLogoutListener(new OnExternalLogoutListener() {
    @Override
    public void onUserLogout(@NonNull String socialId) {
        // Handel result.
    }
});

Статус🔗

Затем, необходимо проверить статус авторизации (залогинен ли пользователь):

bool isLoggedIn = MRGSAuthenticationVKId.Instance.IsLoggedIn();
BOOL isLoggedIn = [[MRGSAuthenticationVKId sharedInstance] isLoggedIn];
import games.my.mrgs.authentication.vkid.MRGSVKId;

final boolean isLoggedIn = MRGSVKId.getInstance().isLoggedIn();

Вход🔗

Для обычного входа воспользуйтесь одним из методов:

// If error occured, error object will be non-null
MRGSAuthenticationVKId.Instance.Login((MRGSError error) => {
    if (error == null) {
        // Auth success
    } 
});

// The response will include an object describing the user and the token, and an error object, if any.
MRGSAuthenticationVKId.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKId:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationVKId sharedInstance] login:^(NSError *error) {
    if (!error) {
        // Auth success
    }
}];

// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationVKId sharedInstance] loginWithCompletionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if (!error) {
        // Auth success
    }
}];
import android.app.Activity;

import androidx.annotation.NonNull;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSCredentials;
import games.my.mrgs.authentication.MRGSLoginCallback;
import games.my.mrgs.authentication.vkid.MRGSVKId;

MRGSVKId.getInstance().login(activity, new MRGSLoginCallback() {
    @Override
    public void onSuccess(@NonNull MRGSCredentials credentials) {
        // Handle result.
    }

    @Override
    public void onError(@NonNull MRGSError error) {
        // Handle error.
    }
});

Вход с доп. разрешениями🔗

Доп. разрешения больше нельзя передавать с клиента. Теперь нужные разрешения нужно настраивать в VK platform.

Важно

Учтите, что пользователь может не дать некоторые разрешения. Список полученных разрешений можно посмотреть в поле credentials.accessToken.authorizedScopes.

Статус авторизации🔗

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

// The information about the user, identifier, name, email, etc.
MRGSAuthenticationVKId.Instance.GetCurrentUser((MRGSAuthenticationUser user, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKId:\User: " + user + "\nError:\n" + error);
    if (error == null) {
        // Work with user data
    }
});

// Information about the token, lifetime, etc.
MRGSAuthenticationVKId.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
    Debug.Log("MRGSAuthenticationVKId:\Token: " + token + "\nError:\n" + error);
    if (error == null) {
        // Work with token info
    }
    else if (error.Code == (int)MRGSAuthenticationErrorCode.ConnectionFailed)
    {
        // No network, try later     
    }
    else
    {
        // Logout user from app (MRGS will logout automatically in SDK)
    }
});
// Возвращается объект, объединяющий в себе информацию о пользователе(идентификатор, имя, email, и др) и о токене.
[[MRGSAuthenticationVKId sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if(!error){
        // Credentials data work
    }
}];

// Возвращается отдельно информация о пользователе, идентификатор, имя, email, и др.
[[MRGSAuthenticationVKId sharedInstance] getCurrentUser:^(MRGSAuthenticationUser *user, NSError *error) {
    NSLog(@"User - %@. Error - %@", user, error);
    if(!error){
        // User data work
    }
}];

// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationVKId sharedInstance] getAccessToken:^(MRGSAuthenticationAccessToken *token, NSError *error) {
    if (!error) {
        NSLog(@"getAccessToken result - %@", token);
    } else {
        NSLog(@"getAccessToken error - %@", error);
    }
}];
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAccessToken;
import games.my.mrgs.authentication.MRGSAuthentication;
import games.my.mrgs.authentication.MRGSUser;
import games.my.mrgs.utils.optional.BiConsumer;
import games.my.mrgs.authentication.vkid.MRGSVKId;

// Returns user's information.
MRGSVKId.getInstance().getCurrentUser(new MRGSAuthentication.UserCallback() {
    @Override
    public void onSuccess(@NonNull final MRGSUser user) {
    }

    @Override
    public void onError(@NonNull MRGSError error) {
    }
});

// Returns authentication's information.
MRGSVKId.getInstance().getAccessToken(new BiConsumer<MRGSAccessToken, MRGSError>() {
    @Override
    public void accept(@Nullable MRGSAccessToken accessToken, @Nullable MRGSError error) {
        if (error != null) {
            Log.d("MRGSAuthentication", "AccessToken error: " + error.getErrorText());
        } else {
            Log.d("MRGSAuthentication", "AccessToken success: " + accessToken);
        }
    }
});

Выход🔗

Для того, чтобы "выйти" из аккаунта пользователя, воспользуйтесь методом:

MRGSAuthenticationVKId.Instance.Logout();
[[MRGSAuthenticationVKId sharedInstance] logout];
import games.my.mrgs.authentication.vkid.MRGSVKId;

MRGSVKId.getInstance().logout();

Получение аватарки🔗

Для получения аватарки пользователя с заданным идентификатором и размером, воспользуйтесь методом:

MRGSAuthenticationVKId.Instance.GetAvatar("required_user_id", MRGSAuthenticationPhotoSize.Small, (Texture2D avatar, MRGSError error) => {
    if(error == null){
        // Operation completed sucessfully
    }
});
[[MRGSAuthenticationVKId sharedInstance] getAvatarForPlayerWithId: @"required_user_id" size:GKPhotoSizeSmall completionHandler:^(UIImage *image, NSError *error) {
    if(!error){
        // Operation completed sucessfully, work with data
    }
}];
import android.graphics.Bitmap;

import androidx.annotation.NonNull;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSAvatarCallback;
import games.my.mrgs.authentication.vkid.MRGSVKId;

// Call #getCurrentUser() to get current user.
final MRGSUser user = ...
// Get user's avatar.
MRGSVKId.getInstance().getUserAvatar(user, new MRGSAvatarCallback() {
    @Override
    public void onSuccess(@NonNull Bitmap bitmap) {
        // Handle result.
    }

    @Override
    public void onError(@NonNull MRGSError error) {
        // Handle error.
    }
});

Последнее обновление: 2025-01-21
Дата создания: 2022-10-04