我似乎无法找到有关如何使用Meteor的DDP验证用户的任何好信息。
这可能吗?如果是这样,最好的方法是什么?如何使用SRP远程登录Meteor?
我目前正在使用直接节点(最终将使用Express)以及this node ddp client。
答案 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"}'
-
如果您不想以上述方式以纯文本形式发送密码,则表示您没有使用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中: - )