17

我似乎找不到任何关于如何使用 Meteor 的 DDP 对用户进行身份验证的好信息。

这可能吗?如果是这样,最好的方法是什么?如何使用 SRP 远程登录 Meteor?

我目前正在使用直接节点(最终将使用 Express)以及此节点 ddp client

4

3 回答 3

35

要通过 DDP 登录,只需发送一个方法调用。您可以根据您想要登录的方式稍微更改它。

我将使用ddp-tools来尝试解释如何登录,因为它将与纯粹的 ddp 进行通信。以下示例中的登录详细信息是

用户名user_1密码qwerty (是的,我知道它不好),电子邮件地址email@email.com登录令牌MxNY9BFPKra2uNWG7

格式是

ddp call <method call name> [<param1>..]

这与ddpclient.call(<method call name>,<param1>,callback)在 nodejs中所做的相同

使用电子邮件和密码登录

ddp call 'login' '{"password":"qwerty","user":{"email":"email@email.com"}}'

使用用户名和密码登录

ddp call 'login' '{"password":"qwerty","user":{"username":"user_1"}}'

使用令牌登录(登录时流星保存的内容

ddp call 'login' '{"resume":"MxNY9BFPKra2uNWG7"}'

--

难点:SRP

如果您不想像上述方式那样以纯文本形式发送密码,那么您没有使用 SSL 安全/https 连接,您可以使用 SRP。

使用 SRP 登录有点棘手,因为它有几个阶段

1. Begin a passwordExchange to establish the key to communicate the hash
2. Send a login call with the hash calculated using the reply from 1)

步骤1:

- 开始 SRP 密码交换:

ddp call 'beginPasswordExchange' '{"A":"A","user":{"email":"email@email.com"}}

响应将类似于

{"identity":"identity","salt":"salt","B":B"}

然后你可以使用它来登录:

ddp call 'login' '{"srp":{"M":"srp hash"}}'

同样,您可以使用用户名而不是上面的电子邮件。

因此,要获得 M 和 A 的值,您需要一个 SRP 库。由于流星中有一个 SRP 库,因此很容易解释如何从每个库中获取密码,这非常棘手。如果你想用另一种语言写一个,你可以使用维基百科的解释来构建方法

所以我们开始一个 srp 交换(来自流星 SRP 包中的 SRP 库),因为你使用的是 node.js,你可以在你的项目中包含所有文件(除了 package.js)

var srp = new SRP.Client(password);

这会给你A,然后你会得到你可以回应的数据:

var response = srp.respondToChallenge(result);

这最终将为您提供 SHA 哈希以使用“M”进行回复,并使用“B”和盐。

最后

登录时不要忘记检查最终响应,以查看结果是否与应有的相符

srp.verifyConfirmation({HAMK: result.HAMK}

同样,这些都来自 Meteor 中的 SRP 库,但它们都是wikipedia上的 SRP 规范的一部分。Meteor 的 SRP 使用 SHA256 作为散列函数。

例子:

于 2013-09-05T20:15:57.700 回答
3

一个包现在正在执行登录部分,将 loginWithPassowrd 方法添加到 DDP 连接。

meteor add ongoworks:ddp-login

然后:

// Get the connection
var conn = DDP.connect(Meteor.absoluteUrl());

// Pass the connection to `DDP.loginWithPassword`, which is otherwise similar to
// the core `Meteor.loginWithPassword` method.
DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) { ... })
于 2015-08-18T12:25:40.847 回答
2

我发现的最接近的是这个,但它在神秘的 Objective-C 中:-P https://github.com/boundsj/ObjectiveDDP/blob/master/Example/Example/LoginViewController.m

它调用的函数虽然在 C 中: https ://github.com/boundsj/ObjectiveDDP/blob/master/ObjectiveDDP/srp/srp.c

Meteor 的 SRP 单元测试在这里: https ://github.com/meteor/meteor/blob/master/packages/srp/srp_tests.js

Meteor srp 代码在这里: https ://github.com/meteor/meteor/blob/master/packages/srp/srp.js

你至少需要这个: https ://github.com/jedp/node-srp

祝你好运。我试图弄清楚如何在 Java 中做到这一点,它比大多数加密方案更神秘。最难的部分是弄清楚 Meteor 如何对身份进行编码,但那是在 Meteor srp 代码中,因为它在 Javascript 中,所以您可能可以解除它:-)

于 2013-07-09T21:11:58.003 回答