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

Login with Amazon🔗

Login with Amazon

Login with Amazon облегчает пользователям вход в ваши приложения и веб-сайты. Вход с помощью Amazon позволяет защитить информацию о ваших клиентах, используя систему аутентификации пользователей, используемую Amazon.com. Вход через Amazon основан на OAuth 2.0, который широко применяется для авторизованного обмена пользователями между сайтами.

Важно

Заметьте, что данный подмодуль зависит от нативного sdk Amazon, и полностью с ним совместим. То есть если у вас сейчас идет работа с нативным sdk, то при переходе на MRGS, мы автоматически подтянем сохраненные сессии.

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

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

Перед началом работы, необходимо настроить аккаунт разработчика на сайте Amazon, и получить API key для приложения. Инструкцию по регистрации проекта и получения необходимых ключей можно найти на сайте Amazon:

Заметьте

На данном шаге нужно только получить API Key. Как его использовать в проекте описано ниже.

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

Для того, чтобы авторизация работала корректно, необходимо добавить некоторые изменения в проект:

Для Unity

Для iOS вам необходимо добавить в Info.plist приложения следующие данные:

  1. API Key, полученный на предыдущем шаге, в поле с ключом "APIKey"
  2. Новую URL-схему для открытия приложения извне вида amzn-<YOUR_BUNDLE_ID>

Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида amzn-<YOUR_BUNDLE_ID>, где YOUR_BUNDLE_ID - это ваш уникальный идентификатор приложения (например, если bundle_id - games.my.MRGServiceExample, то добавляемая схема должна иметь вид: amzn-games.my.MRGServiceExample). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье, но в Unity есть более простой метод добавления данных в plist приложения, описанный ниже.

Для этого добавьте код в Unity post build process:

[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;

    // Второй параметр - ваш API Key, полученный на предыдущем шаге
    rootDict.SetString("APIKey", "<YOUR_API_KEY>"); 

    // Добавление URL-схемы
    PlistElementArray appSchemes = rootDict.CreateArray("CFBundleURLTypes");
    PlistElementDict appSchemesDict = appSchemes.AddDict();
    appSchemesDict.SetString("CFBundleURLName", "");
    PlistElementArray appSchemesArray = appSchemesDict.CreateArray("CFBundleURLSchemes");                
    appSchemesArray.AddString("amzn-<YOUR_BUNDLE_ID>"); // Где YOUR_BUNDLE_ID - это ваш уникальный идентификатор приложения (например games.my.mrgs.MRGServiceExample)

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

Или измените уже существующий код добавления свойств в Info.plist приложения, если он у вас есть.

Для Android:

Необходимо полученный API Key сохранить в файл api_key.txt (название важно) и поместить его в директорию с ассетами андроид. Обычно это директория Assets/Plugins/Android/assets. При компиляции этот файл автоматически попадет в директорию assets внутри apk файла.

Для iOS

Вам необходимо добавить в Info.plist вашего приложения следующие данные:

  1. API Key, полученный на предыдущем шаге, в поле с ключом "APIKey"
  2. Новую URL-схему для открытия приложения извне вида amzn-<YOUR_BUNDLE_ID>

Новую схему открытия приложения нужно добавить, чтобы браузер мог вернуть пользователя обратно в ваше приложение. URL-схема должна представлять из себя строку вида amzn-<YOUR_BUNDLE_ID>, где YOUR_BUNDLE_ID - это ваш уникальный идентификатор приложения (например, если bundle_id - games.my.MRGServiceExample, то добавляемая схема должна иметь вид: amzn-games.my.MRGServiceExample). Подробно про добавление URL-схем в сгенерированном проекте написано в данной статье.

С помощью UI:

Для добавления API Key необходимо:

  • Зайдите в Info.plist вашего приложения
  • Добавьте новую строку с названием «APIKey» и типом данных string
  • Добавьте в созданную строку в виде значения ваш API Key, полученный на предыдущем шаге

Для добавления URL-схемы необходимо:

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

В итоге получится такая структура:

Url schemes

В виде XML:

Добавьте в ваш Info.plist следующие данные:

<key>APIKey</key>
<string>YOUR_API_KEY</string>

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>amzn-<YOUR_BUNDLE_ID></string>
        </array>
    </dict>
</array>

Note: для URL-схем, если у вас уже есть такая структура в plist'е с другими схемами, то можно просто добавить еще один элемент в массив схем (CFBundleURLSchemes)

Для Android

В проекте:

Необходимо полученный API Key сохранить в файл api_key.txt (название важно) и поместить его в директорию с ассетами. Обычно это директория app/src/main/assets. При компиляции этот файл автоматически попадет в директорию assets внутри apk файла.

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

Далее необходимо добавить в проект MRGS SDK и нативное Amazon SDK:

Unity:

Добавление в проект (общая инструкция)

Шаг 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, выберите пакет MRGSAuthenticationAmazon из списка, затем нажмите "Install"
  • Импортируйте модуль: using MRGS;
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.authenticationamazon.unitypackage из скачанного архива.
  • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.authenticationamazon-<version>.tgz из скачанного архива.
  • Импортируйте модуль: using MRGS;

iOS:

Добавление в проект (общая инструкция)

В iOS, при интеграции вручную, необходимо стандартными средствами добавить в проект LoginWithAmazon.framework, которые лежат в папке - Dependencies/MRGSAuthenticationDependencies/Amazon в скачанном с сайта MRGS архиве. Инструкции по добавлению 3d-party библиотек в проект можно найти в интернете.

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

Через Package collection

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

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

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

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

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthenticationAmazon; или #import <MRGSAuthenticationAmazon/MRGSAuthenticationAmazon.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 добавьте последнюю версию MRGSAuthenticationAmazon:

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

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

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

target 'MyProject' do
    pod 'MRGSAuthenticationAmazon', '~> 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 MRGSAuthenticationAmazon; или #import <MRGSAuthenticationAmazon/MRGSAuthenticationAmazon.h>

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

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

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

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

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

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

  • Импортируйте модуль в коде: @import MRGSAuthenticationAmazon; или #import <MRGSAuthenticationAmazon/MRGSAuthenticationAmazon.h>
  • Также, вы можете добавить из архива файлы MRGServiceKit.h и module.modulemap в свой проект, либо в настройках проекта укажите путь до них в разделе Build Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл: @import MRGServiceKit;

Android:

Добавление в проект

Добавьте зависимость в build.gradle файл:

dependencies {
    def mrgsVersion = "6.x.x"

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

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

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

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.browser:browser:1.5.0'
}

Добавление кнопки🔗

Затем, необходимо добавить на экран входа кнопку 'Login with amazon', в соответствии с Amazon button guidelines.

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

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

Делегат🔗

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

// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationAmazon.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());
}
// Установка
[MRGSAuthenticationAmazon 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;
import games.my.mrgs.authentication.amazon.MRGSAmazon;

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

Статус🔗

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

bool isLoggedIn = MRGSAuthenticationAmazon.Instance.IsLoggedIn();
BOOL isLoggedIn = [[MRGSAuthenticationAmazon sharedInstance] isLoggedIn];
import games.my.mrgs.authentication.amazon.MRGSAmazon;

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

Вход🔗

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

// If error occured, error object will be non-null
MRGSAuthenticationAmazon.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.
MRGSAuthenticationAmazon.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationAmazon:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationAmazon sharedInstance] login:^(NSError *error) {
    if (!error) {
        // Auth success
    }
}];

// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationAmazon 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.amazon.MRGSAmazon;

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

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

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

Также у пользователя можно запросить дополнительные данные:

  • Profile - Имя и email пользователя
  • Postal code - Почтовый индекс

Описание enum'a:

* Profile - MRGSAuthenticationAmazon.Scopes.Profile
* Postal code - MRGSAuthenticationAmazon.Scopes.PostalCode
* Profile - kMRGSAuthenticationAmazonScopeProfile
* Postal code - kMRGSAuthenticationAmazonScopePostalCode

Для этого воспользуйтесь методом ниже, передав в него массив дополнительных разрешений, которые Вы хотите получить:

var scopes = new List<string>();
scopes.Add(MRGSAuthenticationAmazon.Scopes.Profile);
scopes.Add(MRGSAuthenticationAmazon.Scopes.PostalCode);

MRGSAuthenticationAmazon.Instance.Login(scopes, (MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationAmazon:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
[[MRGSAuthenticationAmazon sharedInstance] loginWithScopes:@[kMRGSAuthenticationAmazonScopeProfile, kMRGSAuthenticationAmazonScopePostalCode] completionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
}];
import android.app.Activity;

import androidx.annotation.NonNull;

import java.util.Arrays;

import games.my.mrgs.MRGSError;
import games.my.mrgs.authentication.MRGSCredentials;
import games.my.mrgs.authentication.MRGSLoginCallback;
import games.my.mrgs.authentication.amazon.MRGSAmazon;

MRGSAmazon.getInstance().login(activity, Arrays.asList("profile", "postal_code"), new MRGSLoginCallback() {
    @Override
    public void onSuccess(@NonNull MRGSCredentials credentials) {
        // Handle result
    }

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

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

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

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

// Information about the token, lifetime, etc.
MRGSAuthenticationAmazon.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
    Debug.Log("MRGSAuthenticationAmazon:\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, и др) и о токене.
[[MRGSAuthenticationAmazon sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if(!error){
        // Credentials data work
    }
}];

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

// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationAmazon 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.authentication.amazon.MRGSAmazon;
import games.my.mrgs.utils.optional.BiConsumer;

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

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

// Returns authentication's information.
MRGSAmazon.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);
        }
    }
});

Выход🔗

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

MRGSAuthenticationAmazon.Instance.Logout();
[[MRGSAuthenticationAmazon sharedInstance] logout];
import games.my.mrgs.authentication.amazon.MRGSAmazon;

MRGSAmazon.getInstance().logout();

Дополнительно🔗

Учтите, что если вы запросили дополнительные разрешения у пользователя на доступ к дополнительным полям его профиля, мы запросим их автоматически, и данные появятся либо в соответствующих полях объекта класса MRGSAuthenticationUser, или в поле optionalParams у этого объекта.


Последнее обновление: 2023-10-25
Дата создания: 2020-05-28