azure - 如何从Azure移动/应用服务检索用户的附加信息?

标签 azure xamarin azure-mobile-services xamarin.forms

我需要从 Facebook 和 Google+ 等社交帐户获取用户的额外信息。当我第一次阅读 Azure 移动服务时,我认为它是社交身份验证的 chalice 。好吧,经过整整一周的拉头发之后,我开始重新考虑我的第一印象。它确实尽可能轻松地进行身份验证。我将 Google+ 和 FB 配置为与 Azure 配合使用,将 Azure 配置为使用每个提供商的 key / secret ,一切都正常运行。我能够完美登录。当我试图从登录用户那里获取信息时,问题就开始了,老实说,我认为这是基本!

Azure 移动服务返回用户 ID 和 token ,您不能使用它们来请求有关所选提供商的额外信息。因此,即使我使用 FB 的图形 API 创建第二个请求,这也行不通(我已经尝试过!)。该 token 是 Azure 自己的 token 。因此,我从 Carlos Figueira(Azure 的 SE)的几篇文章中发现,我应该自定义我的 Azure 脚本,向 Azure 发出请求,然后我就可以让它工作了。

我还阅读了 Carlos Figueira 的几篇关于如何实现该额外功能的文章,尽管这不是我想要的(自定义服务器),但我决定使用它。但我的返回类型是 MobileServiceUser 并且该类型只有 2 个属性:UserId 和 MobileServiceAuthenticationToken。因此,即使添加了 Carlos 的服务器脚本,我也无法从我的 Xamarin 应用程序中检索额外的信息。

我读了很多东西,研究了很多,但找不到答案=/顺便说一句,这不是答案: How to get user name, email, etc. from 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();
            }
        }
    });
}

最佳答案

您说的是客户端的 token ,对吗?该 token 仅特定于客户端。如果您使用服务器端流程,则服务器是唯一拥有该 token 的服务器。如果您想将其发送给客户端,则需要通过您创建的自定义 API 来完成。

这个class你所说的只包含这两个属性。但在服务器端,您的 ServiceUser 可以访问不同的身份提供商 token ,以便与这些服务器 API 进行通信。您的链接帖子在访问 token 的方式上是正确的,但您在可以访问该 token 的位置上犯了错误,它仅在服务器端(如果您使用服务器定向登录流程)。

关于azure - 如何从Azure移动/应用服务检索用户的附加信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31213502/

相关文章:

azure - 部署azure函数应用程序时出现ARM模板错误

xamarin - 如何防止用户登录后返回登录页面的按钮(Xamarin Forms)

entity-framework - 在 Azure 移动服务 Controller 中添加相关的数据库条目

azure - Monodroid 与 Windows Azure 移动服务

oracle - 数据迁移 - Oracle 到 Azure

azure - 如何在其他类中注入(inject)默认的 azure 函数记录器?

Azure应用服务: Create hybrid connection endpoint API

c# - xamarin 中构建的 Android 后台位置正在永远占用

html - 标签跨度和斜体字体属性的奇怪行为

c# - asp.net 5 上的 GCM/APNS