我该如何重新配置Meteor的accounts-facebook,或者说Meteor的Facebook配置在哪里?

14
Meteor的accounts-facebook包非常容易设置。为了输入Facebook应用程序ID和密钥令牌,我在浏览器中加载了我的Meteor Web应用程序,并单击登录按钮,然后单击“配置Facebook”,然后要求我提供配置值,例如应用程序ID和密钥令牌。
现在我想更改它们,但无法确定它们存储在哪里。我在我的Meteor应用程序目录或子目录中没有看到它们的任何文件,也没有在数据库中找到它们。

基本上和Google登录配置在同一个地方 - 有趣的是这个问题在几天前被问到。 - Dan Dascalescu
6个回答

27

配置数据存储在MongoDB中。

如果您加载

meteor mongo

然后使用 db.meteor_accounts_loginServiceConfiguration.find(),您应该可以看到您的配置数据

您也可以更新它! 如果您收到了

{ "service" : "x", "appId" : "x", "secret" : "x", "_id" : "abc" }`

在同一个Mongo shell中:

db.meteor_accounts_loginServiceConfiguration.update({_id:'abc'},
    {$set:{"appId" : <new app id>, "secret" : <new secret>}});

使用要编辑的服务配置中的_id字段。

在Meteor中,您可以改用以下方式:

ServiceConfiguration.configurations.update({
    service:"facebook"
}, {
    $set: {
        <new params>
    }
});

请注意,在 Meteor 中执行此操作需要添加以下包:

meteor add service-configuration

1
糟糕。看起来我没有刷新数据库的集合?(我正在使用Robomongo GUI)。它们按照你描述的存在。谢谢! - Tyler Collier
虽然了解数据存储的位置很有价值,但我认为下面的答案更好,因为它使用了官方API,可以轻松地从服务器代码中编写脚本。 - oligofren
@oligofren 谢谢,我也更新了我的答案,因为该集合已经再次更名为 ServiceConfiguration - Tarang

19

为了详细说明Kristoffer的答案,以下是如何在运行时配置应用程序:

/server/boot.js

configureFacebook = function(config) {
    // first, remove configuration entry in case service is already configured
    ServiceConfiguration.configurations.remove({
        service: "facebook"
    });

   ServiceConfiguration.configurations.insert({
        service: "facebook",
        appId: config.clientId,
        secret: config.secret
    });
};

// set the settings object with meteor --settings private/settings-local.json
var facebookConfig = Meteor.settings.facebook;
if(facebookConfig) {
    console.log('Got settings for facebook', facebookConfig)
    configureFacebook(facebookConfig);
}

这是与一些本地和生产使用的设置文件配合使用:

/private/local-settings.json

{
    "facebook" : {
        "clientId": "330foobar",
        "secret": "52e1e247a5a1234klasdf087vasdff07"
    }
}

为了在本地开发,我只需执行meteor --settings private/local-settings.json,而要将生产设置部署到 Facebook 的生产服务器上,我会执行meteor deploy --settings private/prod-settings.json


@ShankarRegmi 看起来还不错,但我已经一年没用Meteor了,所以无法保证它的可靠性。谢谢你的建议 :) - oligofren
如果它能够正常工作,@ShankarRegmi,请编辑我的答案并改进它。 - oligofren

4
这个怎么样:
Accounts.loginServiceConfiguration.insert({
  service: "facebook",
  appId: "1292962797",
  secret: "75a730b58f5691de5522789070c319bc"
});

在这里找到:http://docs.meteor.com/#meteor_loginwithexternalservice 此处提供了与外部服务的登录相关的信息。

我看到了,谢谢(顺便说一句,如果我使用{{loginButtons}}的handlebars助手,我不知道那段代码应该放在哪里)。但是我想知道配置文件在哪里,只需在那里更改即可。 - Tyler Collier
为什么不按照支持/文档的方式来做呢?那段代码将放在服务器上,介于 if (Meteor.isServer) { //HERE } 之间,或者放在 server/ 目录下的 .js 文件中。 - Kristoffer K
4
这个解决方案需要更新以反映当前的Meteor。运行:'meteor add service-configuration',函数现在是:'ServiceConfiguration.configurations.insert',而且它的appID代替了"clientId"。 - Lloyd Dewolf
1
@LloydDewolf:谢谢你让我知道!我浪费了太多时间想这个问题 :) 我更新了答案。 - oligofren
@LloydDewolf 谢谢!!谢谢!。 - Mustafa

2
这将在启动时删除所有服务,并根据您的settings.json重新插入它们(meteor --settings settings.json)。 Coffee-script等效代码:
@privateSettings = Meteor.settings.private

for s in privateSettings.services
  ServiceConfiguration.configurations.remove service: s.service
  ServiceConfiguration.configurations.insert s

设置保存在settings.json中:

{
  "private": {
    "services": [{
        "service": "google",
        "clientId": "yourappid.apps.googleusercontent.com",
        "secret": "yoursecret"
    },{ 
        "service": "twitter",
        "consumerKey": "yourconsumerkey",
        "secret": "yoursecret"
    },{
        "service": "facebook",
        "appId": "yourappid",
        "secret": "yoursecret"
    }],
  }
}

1

[注意:对于Meteor >= 1.2.2]

官方的Meteor文档这里解释了如何做到这一点。

添加service-configuration包(否则您无法使用ServiceConfiguration):

$ meteor add service-configuration

然后你可以将这段代码放在 Meteor.startup 中:
Meteor.startup(function () {

  // Set Facebook app configurations
  ServiceConfiguration.configurations.upsert({ 
    service: "facebook" 
  }, {
    $set: {
      appId: 'YOUR_APP_ID',
      secret: 'YOUR_APP_SECRET'
    }
  });

  return;
});

将Facebook配置外部化到settings.json中
也许最终的解决方案是将Facebook应用程序的配置放在设置文件中。
/settings.json

Like this:

{
  "facebook" : {
    "appId": "APP_ID",
    "secret": "APP_SECRET"
  }
}

然后,您需要使用以下命令启动Meteor应用程序

$ meteor --settings settings.json

为了加载设置文件。
最后,您可以从设置文件中在 Meteor.startup 中加载 Facebook 配置:
Meteor.startup(function () {

  // Load and set Facebook app configurations
  var facebookConfig = Meteor.settings.facebook;
  ServiceConfiguration.configurations.upsert({ 
    service: "facebook" 
  }, {
    $set: {
      appId: facebookConfig.appId,
      secret: facebookConfig.secret
    }
  });

  return;
});

1
如果您的应用程序中尚未有太多数据,只需运行以下命令:
meteor reset

这将清除该应用程序的Mongo所有数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接