Мне нужно получить дополнительную информацию о пользователе из учетных записей социальных сетей, таких как Facebook и Google+. Когда я впервые прочитал о мобильных службах Azure, я подумал, что это святой Грааль социальной аутентификации. Что ж, после целой недели выдергивания волос я начинаю пересматривать свое первое впечатление. Он аутентифицируется настолько легко, насколько это возможно. Я настроил Google+ и FB для работы с Azure, настроил Azure на использование ключа/секрета от каждого провайдера, и все просто заработало. Я смог войти в систему отлично. Проблема началась, когда я попытался получить информацию от вошедшего в систему пользователя, что, честно говоря, я считаю базовым!
Мобильные службы Azure возвращают идентификатор пользователя и токен, которые нельзя использовать для запроса дополнительной информации о выбранном поставщике. Так что даже если бы я создал второй запрос, используя, например, API графа FB, это не сработало бы (я пробовал!). Этот токен является собственным токеном Azure. Итак, из нескольких сообщений Карлоса Фигейры (SE в Azure) я узнал, что мне нужно настроить свой сценарий Azure, сделать запрос в Azure, и тогда я смогу заставить его работать.
Я также прочитал несколько сообщений от Карлоса Фигейры о том, как реализовать эту дополнительную функциональность, и хотя это было не то, что я искал (настройка сервера), я решил работать с этим. Но мой возвращаемый тип — MobileServiceUser
, и этот тип имеет только 2 свойства: UserId и MobileServiceAuthenticationToken. Поэтому даже после добавления сценария сервера от Карлоса я не смог получить дополнительную информацию из своего приложения Xamarin.
Я много читал, много исследовал и не мог найти ответа =/ Кстати, это не ответ: Как получить имя пользователя, адрес электронной почты и т. д. от MobileServiceUser?
Кому-нибудь удалось заставить его работать?
PS: я не публикую здесь код, потому что он работает. Если вы думаете, что проверка какой-то части моего кода поможет решить проблему, просто дайте мне знать.
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Скрипт
function insert(item, user, request) {
item.UserName = "<unknown>"; // default
user.getIdentities({
success: function (identities) {
var url = null;
var oauth = null;
if (identities.google) {
var googleAccessToken = identities.google.accessToken;
url = 'https://www.googleapis.com/oauth2/v3/userinfo?access_token=' + googleAccessToken;
} else if (identities.facebook) {
var fbAccessToken = identities.facebook.accessToken;
url = 'https://graph.facebook.com/me?access_token=' + fbAccessToken;
} else if (identities.microsoft) {
var liveAccessToken = identities.microsoft.accessToken;
url = 'https://apis.live.net/v5.0/me/?method=GET&access_token=' + liveAccessToken;
} else if (identities.twitter) {
var userId = user.userId;
var twitterId = userId.substring(userId.indexOf(':') + 1);
url = 'https://api.twitter.com/1.1/users/show.json?user_id=' + twitterId;
var consumerKey = process.env.MS_TwitterConsumerKey;
var consumerSecret = process.env.MS_TwitterConsumerSecret;
oauth = {
consumer_key: consumerKey,
consumer_secret: consumerSecret,
token: identities.twitter.accessToken,
token_secret: identities.twitter.accessTokenSecret
};
}
if (url) {
var requestCallback = function (err, resp, body) {
if (err || resp.statusCode !== 200) {
console.error('Error sending data to the provider: ', err);
request.respond(statusCodes.INTERNAL_SERVER_ERROR, body);
} else {
try {
var userData = JSON.parse(body);
item.UserName = userData.name;
request.execute();
} catch (ex) {
console.error('Error parsing response from the provider API: ', ex);
request.respond(statusCodes.INTERNAL_SERVER_ERROR, ex);
}
}
}
var req = require('request');
var reqOptions = {
uri: url,
headers: { Accept: "application/json" }
};
if (oauth) {
reqOptions.oauth = oauth;
}
req(reqOptions, requestCallback);
} else {
// Insert with default user name
request.execute();
}
}
});
}