通过DDP(和SRP?)通过Meteor进行身份验证

时间:2013-05-24 07:41:37

标签: authentication meteor

我似乎无法找到有关如何使用Meteor的DDP验证用户的任何好信息。

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

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

3 个答案:

答案 0 :(得分:34)

要通过DDP登录,只需发送方法调用即可。根据您的登录方式稍微改变它。

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

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

格式为

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

与在nodejs

中执行ddpclient.call(<method call name>,<param1>,callback)相同

使用电子邮件和密码登录

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

使用用户名和密码登录

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

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

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库,因此很容易解释如何从每个中获取密码,这非常棘手。如果您想用另一种语言编写,可以使用wikipedia's explanation来构建方法

所以我们开始一个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作为散列函数。

示例:

答案 1 :(得分:3)

A package现在正在执行登录部分,将一个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) { ... })

答案 2 :(得分: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中: - )