ios - 如何使用本地设备 Facebook 登录 Meteor?

标签 ios facebook node.js meteor meteorite

假设我登录了我设备的 Facebook 身份验证,例如 iOS 上的系统 Facebook。我获得了一个访问 token

如何使用access token 登录到 Meteor 的 Facebook Oauth 提供商?

最佳答案

要使用通过其他方式(如 iOS Facebook SDK)获得的访问 token 登录 Facebook,请在服务器上定义一个调用适当的 Accounts 方法的方法:

$FB = function () {
    if (Meteor.isClient) {
        throw new Meteor.Error(500, "Cannot run on client.");
    }

    var args = Array.prototype.slice.call(arguments);
    if (args.length === 0) {
        return;
    }
    var path = args[0];
    var i = 1;
    // Concatenate strings together in args
    while (_.isString(args[i])) {
        path = path + "/" + args[i];
        i++;
    }

    if (_.isUndefined(path)) {
        throw new Meteor.Error(500, 'No Facebook API path provided.');
    }
    var FB = Meteor.npmRequire('fb');

    var fbResponse = Meteor.sync(function (done) {
        FB.napi.apply(FB, [path].concat(args.splice(i)).concat([done]));
    });

    if (fbResponse.error !== null) {
        console.error(fbResponse.error.stack);
        throw new Meteor.Error(500, "Facebook API error.", {error: fbResponse.error, request: args});
    }

    return fbResponse.result;
};

Meteor.methods({
    /**
     * Login to Meteor with a Facebook access token
     * @param accessToken Your Facebook access token
     * @returns {*}
     */
    facebookLoginWithAccessToken: function (accessToken) {
        check(accessToken, String);

        var serviceData = {
            accessToken: accessToken
        };

        // Confirm that your accessToken is you
        try {
            var tokenInfo = $FB('debug_token', {
                input_token: accessToken,
                access_token: Meteor.settings.facebook.appId + '|' + Meteor.settings.facebook.secret
            });
        } catch (e) {
            throw new Meteor.Error(500, 'Facebook login failed. An API error occurred.');
        }

        if (!tokenInfo.data.is_valid) {
            throw new Meteor.Error(503, 'This access token is not valid.');
        }

        if (tokenInfo.data.app_id !== Meteor.settings.facebook.appId) {
            throw new Meteor.Error(503, 'This token is not for this app.');
        }

        // Force the user id to be the access token's user id
        serviceData.id = tokenInfo.data.user_id;

        // Returns a token you can use to login
        var loginResult = Accounts.updateOrCreateUserFromExternalService('facebook', serviceData, {});

        // Login the user
        this.setUserId(loginResult.userId);

        // Return the token and the user id
        return loginResult;
    }
}

此代码依赖于 meteorhacks:npm 包。您应该调用 meteor add meteorhacks:npm 并使用 Facebook Node API 生成一个 package.json 文件:{ "fb": "0.7.0"} .

如果您使用 demeteorizer 部署您的应用程序,您将必须编辑输出 package.json 并设置 scrumptious 依赖项 "0.0.1""0.0.0"

在客户端上,使用适当的参数调用方法,然后您就登录了!

在 Meteor 0.8+ 中,Accounts.updateOrCreateUserFromExternalService 的结果已更改为包含 {userId: ...} 的对象,而且不再具有标记 token .

关于ios - 如何使用本地设备 Facebook 登录 Meteor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18118503/

相关文章:

ios - UIlabel layer.cornerRadius 在 iOS 7.1 中不起作用

android - Android 中的 Facebook 集成?

facebook - Facebook 应用程序是使用 PhoneGap 或 Appcelerator 等移动开发框架构建的吗?

facebook - 页面 : how to retrieve link to attached file 的图形 API 直接消息

node.js - 无法在 async-promise 函数中使用 Jasmine 的 'It' block

node.js - 运行具有错误处理且无快速失败功能的并行任务

ios - 在 OSX 上查看文档集

ios - 如果出现标签栏,则无法调整搜索结果 Controller View 底部内容插图

iOS:对 iCarousel 中未选择 View 的约束

javascript - 每 X 秒在服务器中生成随机数