这看起来很简单,但我真的无法弄明白。我想在 Laravel 4 中使用Auth::attempt($credentials)
,但使用已经过哈希的密码(因为它是一个API)。它在我发送未散列的密码时有效,但我不明白如何告诉Auth“不哈希”给定的密码。
快速“演示”
什么有效:
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()
的任何论据,告诉它使用它,而不是试图重新使用它(我认为是这样)?
答案 0 :(得分:3)
您可以手动登录用户
$user = User::find($id);
if ($user->password == Request::getPassword()) {
Auth::login($user->id);
}
答案 1 :(得分:2)
在发送密码之前,您确实不应该对密码进行哈希处理。在没有盐的情况下发送密码之前,你怎么能正确地散列密码呢?如果您在发送密码之前可以访问salt,那么为什么要使用API?
如果您担心传递未经过散列处理的密码的安全性,那么您应该使用SSL来确保数据的安全传输。
在使用网页时不要认为API有任何不同 - 在网站上提交表单之前不要使用密码,而是需要依赖https / SSL的安全级别。 / p>
答案 2 :(得分:1)
Laravel使用的散列方法每次都会生成不同的散列(即使是相同的字符串)。您可以在Hashing for Laravel中详细了解相关信息。正如您所读到的,它不会散列两个字符串并进行比较,而是使用未散列的字符串与散列进行比较。
如果你真的想要这样做,你需要实现自己的Auth Provider和一个不同的散列算法,以便你比较哈希。
如果您担心安全问题,则应考虑使用HTTPS,以便绝不以纯文本形式发送安全详细信息(包括密码)。