Авторизація і використання VK.com API в Xamarin.Android

Xamarin — дуже багатообіцяючою продукт, який допомагає вести кроссплатформенную розробку на Android і iOS на мові C#. На мій погляд, незаслужено упускається з виду співтовариством мобільних розробників. Мова C# можна легко замінити на F#, а в якості платформ взяти ще й OSX і Windows Phone. Загалом, можливостей і перспектив маса, найцікавіших.



Це вже третя моя стаття на хабре, присвячена Xamarin-у, в ній ми розробимо просте, але наочне додаток (у жанрі Hello Word), з використанням VK.com API. Як правило, вихідні матеріали викладені на GitHub і наведені в кінці статті.

Отже, в чому, власне, принципова різниця для завдань, з якими доведеться зіткнутися розробнику, створює native-додаток Android, що підтримує VK.com і розробнику, що вирішує ту ж саму задачу з Xamarin?

Вступ
У випадку з native-розробкою Android, є офіційний SDK VK.com чудово документоване і з достатньою кількістю прикладів. Є навіть альтернативне SDK, на якому побудований проект Kate Mobile, теж з хорошою документацією.

У випадку ж з Xamarin.Android, все далеко не так радісно. Звичайно, можна використовувати native-бібліотеки, написані на Java, і Xamarin надає таку можливість, проте цей шлях не позбавлений підводних каменів. Такі спроби вже були, зокрема, не так давно натрапив на багатообіцяючий проект на codeplex: автор використовував офіційне Android Java SDK VK.com і пересобрал його в *.dll, яку можна використовувати в Xamarin. Однак, справи знову не пішли (у мене ця бібліотека, зокрема, не заробила), і тепер він уже збирається все переписати, грунтуючись на .NET SDK для Windows Phone.

До речі, з приводу VK.com .NET SDK, що під Windows Phone і Windows. Здавалося б, що там C#, що в Xamarin C#, та тільки різниця в платформах все одно дуже істотна, і просто так «скопіювати *.dll», підключити її до проекту в Xamarin і запустити, не вийде.

Звідси виникає питання: як, все-таки, написати додаток для Android в Xamarin з можливостями доступу до соціальної мережі VK.com? Вихід є, будемо використовувати OAuth 2.0 авторизацію і стандартні запити до API. Розглянемо все це в подробицях.

Підготовка
Перший крок — повідомляємо VK.com про те, що ми збираємося розробити програму з використанням його API. У додатку доведеться логінитися по захищеному з'єднанню, тому VK.com вимагає постійного інформування, хто користується його API. В принципі, це цілком логічне рішення, исходяшее з міркувань безпеки, протокол OAuth 2.0 передбачає видачу token-а доступу (але про це трохи пізніше).

Цей крок є обов'язковим, незалежно від платформи та методу розробки програми з використанням VK.com API.

На сторінці управління додатків створимо нове:


Не забуваємо перемкнути стан «включено Додаток і видно всім»:


Тут нам знадобиться «Id додатка». Скопіюємо його, в подальшому стане в нагоді. На цьому розділ управління додатками можна закрити, більше він нам не знадобиться. Хіба що, в подальшому можете зайти в «статистику», там є цікаві для розробника речі, що дозволяють відслідковувати, скільки користувачів і як працюють з додатком.

Ази OAuth 2.0 і Xamarin.Android
Тепер можна приступати до самої цікавої частини — безпосередній розробці! Нам знадобиться чудовий безкоштовний плагін Xamarin.Auth, що дозволяє використовувати протокол OAuth 2.0 (підтримуваний, до речі, API більшості соціальних мереж, зокрема Facebook, Twitter, Instagram, і багатьох інших). Крім підтримки Android, є, звичайно, і iOS, але поки що нам потрібна тільки перша платформа. Для завантаження з сайту Xamarin-а доведеться створити обліковий запис.

Також повинна бути встановлена Xamarin Studio. Я використовую версію 5.5.4, це не має особливого значення, можете використовувати і більш старі/нові версії (остання на даний момент: 5.7.0). При бажанні можете використовувати Visual Studio, але тут справа смаку. Єдиний нюанс, наскільки пам'ятаю, Starter і Indie версії Xamarin-а не підтримують VS, а ось Business Enterprise (у тому числі trial-и, зовсім не укрезающие, до речі, функціонал) — підтримують.

Завантаживши архів Xamarin.Auth, перейдемо до папки Samples/Xamarin.Auth.Sample.Android:


Розробники плагіна Xamarin.Auth призвели дуже зручний приклад роботи з плагіном, який здійснює логін в Facebook. Нам він згодиться, на його прикладі і розберемо ази роботи з протоколу OAuth 2.0. Завантажую проект Xamarin.Auth.Sample.Android.sln в Xamarin Studio:


Зверніть увагу, що плагін Xamarin.Auth повинен бути підключений і коректно відображатися в «References». Якщо з якихось причин немає, то клацніть правою кнопкою миші по «References» і перейдіть в «Edit references». Відкриється меню, як у правій частині скріншота. Там у розділі ".NET Assembly" вручну виберете шлях до бібліотеки Xamarin.Auth.Android.dll, що знаходиться в: «папка Xamarin.Auth\lib\android».

Отже, можна приступати до правки коду.

Оригінальний фрагмент об'єкта типу OAuth2Authenticator, що відповідає за авторизацію:
var auth = new OAuth2Authenticator (
clientId: "App ID from https://developers.facebook.com/apps",
scope: "",
authorizeUrl: new Uri ("https://m.facebook.com/dialog/oauth/"),
redirectUrl: new Uri ("http://www.facebook.com/connect/login_success.html"));

Відредагуємо:
var auth = new OAuth2Authenticator (
clientId: "Id клієнта, який запам'ятали на минулому кроці",
scope: "friends,video,groups",
authorizeUrl: new Uri ("https://oauth.vk.com/authorize"),
redirectUrl: new Uri ("https://oauth.vk.com/blank.html"));

Розберемося по порядку з усіма параметрами:
  • clientId — наш Id, який ми запам'ятали з панелі адміністрування додатків на самому сайті vk.com
  • scope — перелік дозволів, які ми даємо додатком (в даному випадку: друзі, бачив, групи; повний список дивимося у документації до API).
  • authorizeUrl — url авторизації по OAuth 2.0, для VK.com це oauth.vk.com/authorize (із звичайного браузера відкривати не варто)
  • redirectUrl — перенаправлення url, для VK.com це oauth.vk.com/blank.html (із звичайного браузера також відкривати не варто)
На цьому можна запустити перший тест — перевірити, як додаток підключається до сервера і логинится. Для порядку зайдемо в «Strings.xml (всередині папки values) і замінимо напис «Login to Facebook» на «Login to VK.com» і взагалі всі згадки fb на vk :). Не забуваємо про Main.axml в папці layout. Видалимо другу кнопку «Login to Facebook (no, cancel)», це залишилося від оригінального прикладу.



Повний код MainActivity (звідси прибрано все зайве, що нам на даний момент не потрібно):
[Activity (Label = "Xamarin.Auth Sample (Android)", MainLauncher = true)]
public class MainActivity : Activity
{
public string token;
public string userId;

void LoginToVk ()
{
var auth = new OAuth2Authenticator (
clientId: "Id клієнта, який запам'ятали на минулому кроці",
scope: "friends,video,groups",
authorizeUrl: new Uri ("https://oauth.vk.com/authorize"),
redirectUrl: new Uri ("https://oauth.vk.com/blank.html"));
auth.AllowCancel = true;
auth.Completed += (s, ee) => {
if (!ee.IsAuthenticated) {
var builder = new AlertDialog.Builder (this);
builder.SetMessage ("Not Authenticated");
builder.SetPositiveButton ("Ok", (o, e) => { });
builder.Create().Show();
return;
}
else
{
token = ee.Account.Properties ["access_token"].ToString ();
userId = ee.Account.Properties ["user_id"].ToString (); 
}
};
var intent = аутентифікації.GetUI (this);
StartActivity (intent);
}

private static readonly TaskScheduler UIScheduler = TaskScheduler.FromCurrentSynchronizationContext();

protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
var vk = FindViewById<Button> (Resource.Id.VkButton); 
vk.Click += delegate { LoginToVk();};
}
}

Зверніть увагу, як лаконічно можна «навішувати» дії на кнопки через += delegate. Мені така можливість дуже подобається: спочатку шукаємо кнопку по Id, а потім додаємо до неї дію.

На чому перевірити програму? Раніше я використовував смартфон, підключений через usb-шнура, категорично не сприймаючи стандартного Android емулятора. На жаль, швидкість його роботи залишала бажати кращого, а возитися з віртуальною машиною і x86 Android не хотілося.

Все змінилося, коли Xamarin выпустилии емулятор під назвою Android Player, в основі якого лежить все та ж віртуальна машина вбудована VM VirtualBox — працює дуже швидко) і присутній зручний інтерфейс налаштування віртуальних пристроїв з масою наявних шаблонів (майже як у стандартному Android-емулятор, тільки набагато зручніше).



Версія ще часами подглючівает, але для побутових тестів її вистачає. Приємно здивувала ідеальна підтримка Monogame, ніяких вильотів. Варто відзначити, що в Visual Studio 2015 в рамках інтеграції з Xamarin, реалізується новий емулятор Android, що теж дає дуже хороші перспективи.

Загалом, при натисканні кнопки «Login to VK.com» повинна з'явитися сторінка, як на скріншоті вище. Схема роботи проста:


Vk.com при успішній авторизації повертає access token — спеціальний ідентифікатор, ключ доступу. За допомогою цього ключа можна виконувати інші запити до API в межах наданих привілеїв. Самі привілеї ми вказали в полі scope — доступ до переліку друзів, відео, групами користувача (до речі, при авторизації VK.com обов'язково запитає дозвіл на їх використання). Ключ доступу видається на добу.

Виконуємо запити
Отримавши access token, можна надовго піти в вивчення методів VK.com API, благо, чудово документованих. Детальніше з ними ми познайомимося в наступній статті, а поки, зробимо кілька приємних речей, схожих на «Hello Word» у сфері використання VK.com API.

Припустимо, ми залогинились, і після цього додаток запрошує нас вступити в групу. Спершу реалізується ввічливе привітання (а потрібно обов'язково звернутися по імені!) через users.get, потім здійснюється перевірка, чи є користувач в групі через groups.isMember, і в самому кінці — функція вступу в групу groups.join.

Під фрагмент коду, де відбувається одержання token-а і userId, додамо виклик нового методу GetInfo():
token = ee.Account.Properties ["access_token"].ToString ();
userId = ee.Account.Properties ["user_id"].ToString (); 
GetInfo();

І опрацюємо сам метод (опис трохи нижче):
void GetInfo()
{
// створюємо документ xml
XmlDocument xmlDocument = new XmlDocument ();
// робимо запит на отримання імені користувача
WebRequest webRequest = WebRequest.Create ("https://api.vk.com/method/users.get.xml?&access_token=" + token);
WebResponse webResponse = webRequest.GetResponse ();
Stream stream = webResponse.GetResponseStream ();
xmlDocument.Load (stream);
string name = xmlDocument.SelectSingleNode ("response/user/first_name").InnerText;

// робимо запит на перевірку, 
webRequest = WebRequest.Create ("https://api.vk.com/method/groups.isMember.xml?group_id=20629724&access_token=" + token);
webResponse = webRequest.GetResponse ();
stream = webResponse.GetResponseStream ();
xmlDocument.Load (stream);
bool habrvk = (xmlDocument.SelectSingleNode ("response").InnerText =="1");

// виводимо діалогове вікно
var builder = new AlertDialog.Builder (this);
// користувач полягає в розділі "хабрахабр"?
if (!habrvk) {
builder.SetMessage ("Привіт "+name+"!\r\n\r\пТы не перебуваєш у групі habrahabr.Не хочеш вступити?");
builder.SetPositiveButton ("Так", (o, e) => {
// уточнивши, що користувач бажає вступити, відправимо запит
webRequest = WebRequest.Create ("https://api.vk.com/method/groups.join.xml?group_id=20629724&access_token=" + token);
webResponse = webRequest.GetResponse ();
});
builder.SetNegativeButton ("Ні", (o, e) => {
});
} else {
builder.SetMessage ("Привіт "+name+"!\r\n\r\пОтлично! Ти перебуваєш в групі habrahabr.");
builder.SetPositiveButton ("Ок", (o, e) => {
});
}
builder.Create().Show();
}

Тут я використовую режим роботи в xml і обробляю всі результати запиту XmlDocument. Ніхто не заважає використовувати формат JSON (він теж цілком зручний), достатньо лише прибрати ".xml" у запиті, справа смаку.

Отже, три команди:Інтересу заради, спробуйте ввести цю сходинку в адресний рядок браузера :). Дописавши token, звичайно (його можна отримати, поставивши в програмі breakpoint на рядок привласнення відповідної змінної). Побачите, що працювати з VK.com API (так і більшістю інших) — просто! У загальному випадку задача зводиться до елементарного парсингу xml або JSON.

Результат виконання команди «api.vk.com/method/groups.getById.xml?group_id=20629724&access_token=» + token:


Діалогові вікна програми:


Вихідні коди проекту наведено на GitHub. Можливо, скоро там з'явиться ще що-небудь цікаве на тему VK.com API і Xamarin. Про це обов'язково напишу в новій статті.

З повагою, Dageron.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.