Gigya для iPhone
Аннотация
Как добавить в авторизацию через социальные сети в свое приложение для iPhone? Всех драконов можно победить самому. А можно позвать в помощники Gigya.
Gigya — это сервис, который берет на себя работу по авторизации пользователя. Список провайдеров в том виде, в каком он используется потом в API: facebook, twitter, yahoo, messenger, google, linkedin, myspace, aol,orkut, blogger, wordpress, typepad, Paypal, livejournal, hyves, verisign, openid, netlog, signon, orangefrance, mixi, livedoor. В списке нет ВКонтакте. Думаю, это объясняется тем, что Gigya — американский сервис, их команда находится в Маунтин-Вью, штат Калифорния. И до наших Палестин они пока не добрались (наша земля богата Логинзой).
Gigya вытаскивает порядочное количество данных. Но не все. Скажем, от Twitter нельзя получить адрес электронной почты пользователя и его день рождения. Сводную таблицу возможностей можно посмотреть в документации.
Для iPhone и Android имеется свой SDK. Сначала следует скачать архив. В архиве все необходимые файлы для работы: классы для работы с Gigya и отдельно для работы с JSON, которая представлена здесь известным фреймворком SBJSON.
Для теста, пожалуй, будет проще создать проект с готовым View. После добавления файлов GSSDK к проекту нужно сделать #import «GSAPI.h». Указатель GSAPI *gsAPI разместим в интерфейсе созданного View. Выделение памяти и инициализацию — во viewDidLoad:
gsAPI = [[GSAPI alloc] initWithAPIKey:@"API KEY" viewController:self];
Откуда взять API KEY? Нужно зарегистрироваться на сайте Gigya. Процесс создания аккаунта традиционный. После регистрации можно будет привязать к аккаунту несколько сайтов. В списке сайтов есть API KEY. У меня он начинался с «2_». Нужен этот ключ, а не Secret Key, который указан снизу. Никаких преобразований для API KEY не требуется. Можно заметить, что справа от API KEY есть список сервисов для сайта. Причем зеленым отмечен только OpenID. Это не значит, что остальные недоступны. Это нужно, чтобы при входе через них высвечивалось, что авторизацию запрашивает не Gigya, а ваше приложение, которое, понятно, в этом случае придется отдельно регистрировать. Так что можно оставить все это как есть.
Не спешите закрывать аккаунт. В настройках сайта внизу найдите секцию Advanced. Она никак не выделена. Развертите ее и отметьте Enable Mobile or Desktop client applications API access. Без этого ваше приложение будет возвращать ошибку «400011 Invalid redirect_uri». Да и то, если вы отловите ее в событии gsLoginUIDidFail. Теперь все. Можно возвращаться в XCode (или CIDR). Интерфейс выглядит примерно так:
#import <UIKit/UIKit.h>
#import "GSAPI.h"
@interface GigyaViewController : UIViewController <GSLoginUIDelegate> {
GSAPI *gsAPI;
IBOutletUIButton *loginButton;
}
- (IBAction)loginWithGigya;
@end
Добавлен протокол GSLoginUIDelegate. И еще кнопка с ее обработчиком. Соответственно, в Interface Builder установлены все связи. Во viewDidLoad, как мы помним, инициализация API:
gsAPI = [[GSAPIalloc] initWithAPIKey:@"API KEY" viewController:self];
Важно, чтобы этот объект был в единственном экземпляре. Теперь добавим реализацию двух методов протокола GSLoginUIDelegate и обработчик кнопки, который будет вызывать список провайдеров.
- (void)gsLoginUIDidFail:(int)errorCode errorMessage:(NSString *)errorMessage context:(id)context {
NSLog(@"gsLoginUIDidFail: %i %@", errorCode, errorMessage);
}
- (void)gsLoginUIDidLogin:(NSString*)provider user:(GSDictionary*)user context:(id)context {
NSLog(@"gsLoginUIDidLogin: provider=%@ user=%@ context=%@",provider,[user stringValue],context);
}
- (IBAction)loginWithGigya {
GSDictionary *d = [[[GSDictionaryalloc] init] autorelease];
[d putStringValue:@"facebook, twitter"forKey:@"enabledProviders"];
[gsAPIshowLoginUI:d delegate:self context:nil];
}
Словарь можно и не создавать, передав nil. Это сделано для наглядности. В списке останутся только Facebook и Twitter. После запуска и клика на кнопку будет показан список провайдеров. Выбор элемента влечет авторизацию. Потом осуществляется возврат на экран с кнопкой. В консоли должна появится информация о текущем входе и пользователе.
Несколько моментов напоследок. Если вдруг вы решили поместить инициализацию и вызов showLoginUI подряд во viewDidLoad, скорее всего, у вас ничего не запустится, экран автоматически не сменится на экран выбора провайдера. Можно выставить performSelector с задержкой в 0.01, все должно сработать. Дело в анимации. Еще в файле GSWebViewController.m можно сделать #define _DEBUG, тогда в консоль будет выводится информация о промежуточных шагах. Это все. Удачи.
Файлы статьи
Исходные тексты проекта, zip-архив 1.1 Мб