3

这似乎很容易,但我真的无法弄清楚。我想Auth::attempt($credentials)Laravel 4中使用,但密码已经过哈希处理(因为它是一个 API)。当我发送未散列的密码时它可以工作,但我不明白如何告诉 Auth “不散列”给定的密码。

快速“演示”</p>

什么有效:

Auth::attempt([Request::getUser(), Request::getPassword()]);

curl --user username:notHashedPassword localhost:8000/api/

什么不起作用:

Auth::attempt([Request::getUser(), Request::getPassword()]);

curl --user username:$2y$08$xo7HpxFyeF2UKHOYs/e localhost:8000/api/

有没有我可以传递给它的论点来Auth::attempt()告诉它按原样使用它而不是试图重新散列它(就像我认为的那样)?

4

3 回答 3

3

您可以手动登录用户

$user = User::find($id);

if ($user->password == Request::getPassword()) {
    Auth::login($user->id);
}
于 2013-04-14T16:51:21.933 回答
2

在发送密码之前,您真的不应该对密码进行哈希处理。在没有盐的情况下发送密码之前,您将如何正确地散列密码?如果您在发送密码之前可以访问盐,那么您为什么要使用 API?

如果您担心传递未经哈希处理的密码的安全性,那么您应该使用 SSL 来确保数据的安全传输。

不要认为 API 与使用网页有任何不同——并且在您在网站上提交表单之前不要加盐密码,而是如果您需要依赖于 https / SSL 的安全级别。

于 2013-04-14T17:04:37.537 回答
1

Laravel 使用的散列方法每次生成不同的散列(即使是相同的字符串)。你可以在Hashing for Laravel中阅读更多相关信息。如您所见,它不会对两个字符串进行散列并比较它们,而是使用未散列的字符串与散列进行比较。

如果你真的想这样做,你需要实现你自己的 Auth Provider 和一个不同的散列算法,让你比较散列。

如果您担心安全性,您应该考虑使用 HTTPS,以便永远不会以纯文本形式发送安全详细信息(包括密码)。

于 2013-04-14T16:59:31.177 回答