Yahoo authenticate & fetch profile details iOS

Я перечислил здесь шаги интеграции Yahoo, которые я выполнил.

  • Шаг 1. Я пошел в http://developer.yahoo.com/social/sdk/objectivec/
  • Шаг 2. Загрузите всю структуру отсюда - http://github.com/yahoo/yos-social-objc
  • Шаг 3. Я перетащил эту фреймворк в свой проект.
  • Шаг 4. Включен флаг fno-objc-arc для файлов фреймворка yahoo.
  • Шаг 5. Я сделал #import "YOSSocial.h" в моем файле заголовка controlController.
  • Шаг 6. В режиме загрузки я разместил Блок кода 1, чтобы создать объект сеанса.
  • Шаг 7. Нажав кнопку, я вызываю Блок кода 2.
  • Шаг 8. В AppDelegate.m я реализовал метод как Блок кода 3.
  • Шаг 9. Я получаю oauth_token и oauth_verifier в перенаправлении.

Блок кода 1

 - (void)viewDidLoad {
    [super viewDidLoad];
    self.session = [YOSSession sessionWithConsumerKey:@"ConsumerKeyHere"
                                           andConsumerSecret:@"ConsumerSecretKeyHere"
                                            andApplicationId:@"AppKey"];
    BOOL hasSession = [self.session resumeSession];
    if(hasSession == FALSE) {
        // custom call back URL which will redirect to our-app.
        // 10.0.0.76/iOS/callback.php redirects 
        // to com.mymobileapps.currentApp.yahoo
        [self.session 
           sendUserToAuthorizationWithCallbackUrl:
           @"http://10.0.0.76/iOS/callback.php"];
    } else {
        [self sendRequests];
    }
}

Блок кода 2

- (void)sendRequests {
    // initialize a user request for the logged-in user
    YOSUserRequest *request = [YOSUserRequest requestWithSession:self.session];

    // fetch the user profile data
    [request fetchProfileWithDelegate:self];
}

- (void)requestDidFinishLoading:(YOSResponseData *)data {
    // parse the response text string into a dictionary
    NSDictionary *rspData = [NSJSONSerialization JSONObjectWithData:[data.responseText dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
    NSDictionary *profileData = [rspData objectForKey:@"profile"];

    // format a string using the nickname object from the profile.
    NSString *welcomeText = [NSString stringWithFormat:@"Hey %@ %@!",
                             [profileData objectForKey:@"givenName"],
                             [profileData objectForKey:@"familyName"]];
    NSLog(@"welcometext is %@",welcomeText);
    self.lblProfile.text = welcomeText;
}

Блок кода 3

- (BOOL)application: (UIApplication *)application
            openURL: (NSURL *)url
  sourceApplication: (NSString *)sourceApplication
         annotation: (id)annotation {
    NSString *str = [[url description] stringByReplacingOccurrencesOfString:@"com.mymobileapps.currentApp.yahoo://oauth-response?oauth_token=" withString:@""];
    NSArray *ar = [str componentsSeparatedByString:@"&oauth_verifier="];
    NSLog(@"oauth_token is %@",[ar objectAtIndex:0]);
    NSLog(@"oauth_verifier is %@",[ar objectAtIndex:1]);
    // How my session will get updated now with valid authentication done?
    return YES;
}

Я следил за каждым шагом, как описано здесь, http://developer.yahoo.com/social/sdk/objectivec/, и я также реализовал перенаправление, как описано здесь - Как перенаправить из Yahoo в мое приложение IOS после аутентификации?

ВОПРОС выглядит следующим образом. Я все еще не могу получить данные профиля пользователя, такие как пол, дата рождения и т.д. То есть - из кода 2 я получаю данные как ноль.

Что отсутствует в моем коде для извлечения данных профиля пользователя?

Другие ссылки.

- (BOOL)application: (UIApplication *)application
            openURL: (NSURL *)url
  sourceApplication: (NSString *)sourceApplication
         annotation: (id)annotation {
    return [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation];
}

Над кодом показано, как структура Google+ обрабатывает перенаправление и управляет локальным сеансом. В случае с Yahoo я не могу найти подробностей, которые могут помочь обновить локальную сессию мобильного приложения.

Edit:
Если это невозможно через Yahoo OAuth, Как можно получить основные сведения о профиле (например, пол, дата рождения, идентификатор электронной почты, имя и т.д.) Из Yahoo?

Ответы

Ответ 1

Вот решение.

ПРИМЕЧАНИЕ. Для этого вам понадобится промежуточный сервер.

  • Шаг 01. Загрузить PHP yahoo framework http://github.com/yahoo/yos-social-php
  • Шаг 02. Запустите сервер WAMP/XAMPP.
  • Шаг 03. Получить URL-адрес
    • example - http://10.0.0.76/iOS/yos-social-php-master/sample/sampleapp.php
  • Шаг 04. Вернитесь к проекту XCode.
  • Шаг 05. Откройте XIB, поместите кнопку для Yahoo и подключите метод IBAction.
  • Шаг 6. В методе IBAction перейдите к полученному URL из приложения iOS в URL. См. Блок кода 1
  • Шаг 07. Добавить метод в AppDelegate.m для обработки перенаправления с сервера на ваше мобильное приложение. См. Блок кода 2
  • Шаг 8. Убедитесь, что ваше приложение поддерживает обработку перенаправления. Откройте ваш проект-info.plist в качестве исходного кода и убедитесь, что у вас есть действительные URL types, URL identifier и URL Schemes. как указано в Блок кода 3
  • Шаг 09. Теперь ваше мобильное приложение готово для перенаправления с сервера.
  • Шаг 10. Откройте файл yourLocalServer/iOS/yos-social-php-master/sample/sampleapp.php. (https://github.com/yahoo/yos-social-php/blob/master/sample/sampleapp.php)
  • Шаг 11. Код комментария от 97 до 106.
  • Шаг 12. Поместите код, как указано в Блок кода 4
  • Шаг 13. Запустите проект, нажмите кнопку в приложении iOS.
  • Шаг 14.. Приложение будет перемещаться по вашей странице сайта. Страница сайта выполнит аутентификацию и получит сведения о профиле.
  • Шаг 15.. Как только проверка подлинности будет завершена, страница сайта перенаправит обратно в ваше мобильное приложение с такими деталями, как: Пол, полное имя, дата рождения, руководство, URL-адрес профиля и др.

Резюме

Mobile App переходит на сервер → Сервер управляет аутентификацией через OAuth-php. После проверки подлинности сервер получает данные профиля, а сервер указывает, что сафари перейдет обратно в приложение your-mobile-App. Ваше мобильное приложение получает все данные в блоке кода

Блок кода 1

- (IBAction)connectYahoo:(id)sender {
      [[UIApplication sharedApplication] 
           openURL:[NSURL URLWithString:
           @"http://yourLocalServer/iOS/yos-social-php-master/sample/sampleapp.php"
      ]];
}

Блок кода 2

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
   sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {

    if([[url scheme] isEqualToString:@"com.yourcompany.app.fsq"]) {
        return [self.obj_LoginHomeVCtr.foursquare handleOpenURL:url];
    } else if([[url scheme] isEqualToString:@"com.yourcompany.app.googleplus"]){
        return [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation];

    }else if([[url scheme] isEqualToString:@"fb188315544652080"]){
        return [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication
                    fallbackHandler:^(FBAppCall *call) {
                        NSLog(@"In fallback handler");
                    }];
    } else if ([[url scheme] isEqualToString:@"com.yourcompany.app.yahoo"]){
        STLog(@"URL is %@",url);
        return YES;
    }
    return YES;
}

Блок кода 3

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.yourcompany.app.yahoo</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>com.yourcompany.app.yahoo</string>
        </array>
    </dict>
</array>

Блок кода 4

  else if($hasSession && $profile) {
      $string = "com.yourcompany.app.yahoo://response?birthdate=" . $profile->birthdate . "&familyName=" . $profile->familyName. " " . $profile->givenName . "&gender=" . $profile->gender . "&guid=" . $profile->guid . "&image=" . $profile->image->imageUrl;
      echo '<meta http-equiv="Refresh" content="1;URL='. $string .'">';
  }
?>

Ответ 2

fetchProfileWithDelegate: (источник здесь) создает URL-адрес и задает некоторую информацию заголовка, затем передает эти данные в [YOSRequestClient -sendAsyncRequestWithDelegate:] (источник здесь).

Затем клиент запроса создает NSMutableURLRequest и NSURLConnection и запускает соединение.

После загрузки данных (если есть) YOSResponseData берет на себя и создает новый объект из загруженных данных (здесь исходный код).

Нет никакого пути к коду, который я могу увидеть, чтобы объект serviceResponseData прошел в nil. Вы должны хотя бы увидеть [data didSucceed], который скажет вам, был ли ответ HTTP < 400. Как ни странно, если сервер просто открывает и закрывает соединение без ответа HTTP, я считаю [data didSucceed] == YES, хотя это явно не удалось (с 0 и 400).

Не похоже, что вы делаете что-то неправильно. Я предполагаю, что с последняя фиксация была 4 года назад, и с тех пор компания пережила значительную реструктуризацию, проект был оставлен, и никто беспокоился об этом.

Обновление. Помимо отсутствия обновлений в течение 4 лет, Yahoo форум разработчиков для этого программного обеспечения был закрыт. Я не думаю, что Yahoo API для этого программного обеспечения уже работает. -

Ответ 3

В документах Yahoo, которые вы указали здесь, есть несколько вещей, которые нужно проверить:

  • Убедитесь, что вы запрашиваете и получаете разрешение на правильные разрешения от пользователя

  • Осмотрите объект YOSResponseData, если возникла ошибка, он должен содержать объект NSError.

  • Он также содержит объект NSHTTPURLResponse. Проверьте заголовок ответа и код состояния.

Вы, вероятно, уже проверили этот материал, если так добавить результаты к вопросу.