- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 meteor@1.1.6、accounts-base、accounts-password 和 Meteorhacks cluster .
一点背景:
我正在编写一个网络应用程序,允许用户从我们的咖啡馆购买零食作为 Meteor 的概念验证。该应用程序在集群中分为两个服务:管理零食和购买的咖啡馆服务,以及管理用户和身份验证的用户服务。我们希望分离,因为将来我们会有其他服务订阅同一组用户,我们不想在多个地方管理用户。
什么有效
用户使用 LDAP 凭据登录用户服务。如果不存在使用其名称的 Meteor 用户帐户,则会使用其 ldap 信息创建一个新帐户。这些帐户使用 Meteor 允许的默认属性发布。用户将获得一个默认 PIN 码作为用于订阅服务的密码(目前他们无法更改)。
咖啡馆应用程序订阅了用户服务上的 Meteor.users 发布,然后显示所有活跃用户。由于咖啡厅应用程序设计为在平板电脑上运行,我们希望尽量减少打字,因此我们允许用户通过触摸他们的用户名来选择他们的帐户。之后,他们会获得一个密码键盘,用于输入他们的密码(密码),该密码将被散列并通过集群发送,以在用户服务上进行身份验证。用户服务然后调用 Accounts._checkPassword
来验证请求,并将返回一个包含 userId
和/或任何错误的对象。我们正在使用一个名为 loginWithPin
的自定义登录方法,它与 loginWithPassword
基本相同。所有这一切都非常完美。
什么不起作用
当身份验证 API 返回结果时,问题就出现了。在您输入正确 密码之前,一切都是正确的。我们的自定义方法 loginWithPin
总是返回错误,但奇怪的是当您输入正确的 PIN 时。身份验证过程通过用户服务层并传回一个对象,如 { userId: '...' }
,但自定义方法抛出 403 错误,Access Denied
作为原因。
我假设返回带有 userId 的对象的自定义登录方法实际上会通过该 id 登录用户。那,我在 accounts-base
或 accounts-password
中找不到会引发 403 Access Denied 错误的任何地方。
TLDR
我的自定义loginWithPin
方法在使用正确 pin 时返回[403] Access Denied
错误,但身份验证正在另一个应用程序的API 上进行用户密码实际所在的位置。
咖啡厅应用代码
客户端/enter_pin/enter_pin.js
//...
if ( //pin fully entered ) {
Meteor.loginWithPin(password.value, function( err ) {
if ( Meteor.user() ) {
// login successful, route to cafe
Router.go('/cafe');
} else {
console.error('An error occurred while logging in: ', err);
// other stuff to reset pinpad
}
}
}
客户端/登录.js
Meteor.loginWithPin = function( pin, callback ) {
var username = Session.get('selectedUser');
check(username, String);
// hash pin before sending it across cluster connection
pin = Package.sha.SHA256(pin);
// send login request
Accounts.callLoginMethod({
methodArguments: [{
user: {
username: username
},
pin: pin
}],
userCallback: callback
});
};
服务器/login.js
Accounts.registerLoginHandler(function( request ) {
// use runAsync here since login request is asynchronous and we want to pause execution until this returns
var response = Async.runSync(function( done ) {
ClusterConnection.call('authenticateUser', request.user.username, request.pin, function( err, res ) {
if ( !err && !res.error ) {
console.log('successful login');
done(null, res);
} else {
console.log('unsuccessful login');
done(null);
}
});
});
// this should be either { userId: '...' }, or null if an error is present
return response.result;
});
服务 API
服务器/api.js
Meteor.methods({
'authenticateUser': function( username, pin ) {
check(username, String);
check(pin, String);
var user = Meteor.users.findOne({username: username});
var password = {digest: pin, algorithm: 'sha-256'};
return Accounts._checkPassword(user, password);
}
});
如果 Meteor.user()
,则 Access Denied
引发的错误是在 client/enter_pin/enter_pin.js
中发现的错误是未定义的,这是因为没有发生登录。然而,即使身份验证 API 成功返回其中包含 userId 的对象,也会触发此错误。
更新
cafe app server/cluster.js(我们连接到用户服务的地方)
Cluster.connect('mongodb://localhost:27017/service-discovery');
Cluster.register('cafe');
EmployeeConn = Cluster.discoverConnection('employees');
EmployeeConn.subscribe('employees');
Meteor.users = new Mongo.Collection('users', {connection: EmployeeConn});
我认为这里的最后一行是主要问题,因为我正在重新定义 Meteor.users 集合。但是,我不知道我们如何准确地将我们从用户服务获得的数据同步到服务器上的 Meteor.users 而不覆盖它。
最佳答案
However, I'm at a loss as to how exactly we would sync the data we get from the user-service to Meteor.users on the server without overwriting it.
Meteor 旨在提供简单的 SyncData 工作流程。
例如,您可以为每个服务使用另一个单独的集合,并引用 Meteor.users 集合。
然后您可以在需要的地方订阅服务集合。
在你的 Meteor.users 中你会有一个新字段:
pinBasedServices: [
{
service: 'cafe',
pin: 'XXX',
lastLogin: '',
generatedHashTokenFromTheServiceToGetTheDataFrom:'somehash',
/* whatever */
},
{
service: 'cheeseCakeService',
pin: 'XYZ',
/* So on.. */
}
]
我希望,我可以给你另一个思考方向,让你不必覆盖 Meteor Collections.. 只需在它的基础上构建。
如果您想以您需要的方式同步数据,您还可以观察 Meteor Collections。
关于authentication - Meteor自定义登录报错: access denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30734543/
我在尝试在 Meteor.com 上托管的经历非常复杂。 我经常收到“此网站已关闭。稍后再试。”。一开始我不知道为什么,但后来我怀疑问题是我不小心恢复了“system.users”集合造成的。我尝试在
我有点好奇,与复制 Meteor 应用程序、启动 tmux session 并仅运行 meteor 相比,Meteor Up(或其他 Meteor 应用程序部署过程,如 Modulus)是否能做任何花
我与meteor 合作创建了一个应用程序。在 meteor Meteor.methods 和 Meteor.publish 用于执行数据库操作。 I know use of Meteor method
我有一个相当大的 meteor 项目并安装了几个 meteor 包。我这样做只是为了试用一个 meteor 包,看看它是否适用于我的项目。不幸的是,在确定我不需要在我的项目中安装这些包后,我没有卸载这
对于生产为什么我应该“捆绑” meteor 应用程序而不仅仅是复制 服务器上的源使用“ meteor ”命令? 基本上有什么区别: “meteor bundle app.tar.gz”,然后安装正确版
我是 Meteor 的新手,我想知道我们如何要求用户在创建帐户时上传他的图片?我正在使用基本的 Meteor 帐户来创建用户帐户。我希望用户能够上传他的图片,并且还能够在他登录时和在我网站的登录页面上
我正在学习 Meteor Angular 2 教程。在第 6 步,我随机尝试了“ meteor 更新”,这使我的样本崩溃了。更新有效,服务器正在启动。然而,浏览器屏幕现在保持空白,并且在控制台中出现错
在我的 meteor app我需要实现表格排序。现在我正在做的是设置一个 session variable对于每个列并根据要排序的项目切换其值。 任何人都可以提出更好的选择吗? 最佳答案 我推荐 表格
我向用户发送了注册电子邮件,当他输入密码和其他详细信息时,我试图重置密码,但它抛出错误 uncaught error extpected to find a document to change 正如
我运行排行榜示例。然后我更改了 leaderboard.js 中的 names 变量(Meteor.startup 函数参数初始化的一部分)中的科学家条目之一并保存了文件。 我应该期待 meteor
我有一个 meteor 1.0 应用程序。我添加了一堆包,例如:meteor add kevohagan:ramda .但我在任何地方都找不到它。我什至无法在我的系统上找到它。 在我的项目中: $>
我有一个 meteor 移动应用程序在结构上工作;我真的需要将 View 与一些页面转换拼接在一起。 我看了iron-transitioner项目,但看起来开发已经停止? (最后一次提交 6 个月前,
我在“发现 meteor ”一书之后构建了我的第一个 meteor 添加。 但是我现在遇到了以下错误: 错误:在ian:accounts-ui-bootstrap-3 中没有找到accounts_ui
是否可以在负载均衡器后面使用 Mongodb 运行 meteor 应用程序的多个实例? 似乎如果一个应用程序的多个实例在不同的服务器上运行,那么它们就不会知道其他实例对 Mongo DB 所做的更改
我在/client/main.coffee 中的新客户端代码 Xingyun = Meteor.connect "localhost:3000" System = new Meteor.Collect
在 Meteor.publish ,使用 this.error 有什么区别并简单地抛出 Meteor.Error ? 最佳答案 this.error仅在发布方法内可用。每 the docs : Sto
假设我想在 Meteor 的后端使用与 Mongo 不同的数据库,并且还想在前端使用像 D3.js 这样的可视化库。 目前有可能吗? 如果不是我自己添加它会有多复杂? 谢谢 最佳答案 https://
我已经在 Meteor 中制作了一个 watch-as-I-type 实时聊天服务,但是我在 Meteor 中的内置元素保存功能方面遇到了麻烦。基本上,当输入的文本具有焦点时,我需要不更新当前的聊天消
我想知道 Meteor 是否可以与我的用例一起使用。 我有一个可在 App Store 上使用的移动应用程序。这个应用程序包含一个小调查,用户将在没有互联网连接的情况下做出回应。然后用户将关闭应用程序
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我是一名优秀的程序员,十分优秀!