Трябва да получа допълнителна информация за потребителя от социални акаунти като Facebook и Google+. Когато за първи път прочетох за мобилните услуги на Azure, си помислих, че това е светият граал на социалното удостоверяване. Е, след цяла седмица скубане на косата започвам да преосмислям първото си впечатление. Той се удостоверява толкова лесно, колкото би могъл да направи. Конфигурирах Google+ и FB да работят с Azure, конфигурирах Azure да използва ключа/тайната от всеки доставчик и всичко просто проработи. Успях да вляза перфектно. Проблемът започна, когато се опитах да получа информация от регистрирания потребител, което честно казано смятам за основно!
Мобилните услуги на Azure връщат UserId и Token, които не можете да използвате, за да поискате допълнителна информация за избрания доставчик. Така че дори и да създам втора заявка, използвайки например графичния API на FB, това няма да работи (опитах!). Този токен е собствен токен на Azure. Така че разбрах от няколко публикации на Карлос Фигейра (SE в Azure), че трябва да персонализирам моя скрипт на Azure, да направя заявка до Azure и след това ще мога да го накарам да работи.
Също така прочетох няколко публикации от Carlos Figueira за това как да внедря тази допълнителна функционалност и въпреки че това не беше това, което търсех (персонализиране на сървъра), реших да работя с това. Но моят тип на връщане е 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();
}
}
});
}