我正在为政府机构开发API,他们需要满足以下条件:
使用散列的基本身份验证:
$pass = 'password';
$hash_pass = sha256($pass.date('Y-m-d'));
$full_hash = base_64('username'.':'.$hash_pass);
因此,他们向我发送了标题授权书,例如:
基本$ full_hash
在我的中间件上,我正在使用它:
public function handle($request, Closure $next)
{
$authorization_code = explode(" ", $request->header('Authorization'));
$hash = base64_decode($authorization_code[1]);
$user = explode(":", $hash);
$data['username'] = $user[0];
$user_db = User::where('username', $data['username'])->first();
$data['password'] = $user[1];
$today = date('Y-m-d');
$request->headers->set('php-auth-user', $data['username']);
$request->headers->set('php-auth-pw', $data['password']);
return $response = auth()->basic('username') ?: $next($request);
}
在我的数据库中,密码已使用bcrypt加密。
我的问题是:有一种强制登录的方法吗?用我自己的逻辑?
如果我不对数据库上的密码进行加密,则可以使用以下命令将$ data ['password']与$ user_db-> password进行比较:
if($data['password'] == hash("sha256", $user_db->password.$today, false))
好吧。谢谢大家!
答案 0 :(得分:1)
您绝对不应在数据库中以明文形式存储密码。
您应该创建一个API密钥表,其中API密钥属于用户,并使用该表进行身份验证。然后,您可以撤消,监视每个键的使用情况。
但是,请勿在数据库中以明文形式存储密码。永远!
答案 1 :(得分:1)
我不知道我做对了吗。
但是我“解决”了这一问题,将原始密码保留在数据库中,并进行了类似的比较:
if($data['password'] == hash("sha256", $user_db->password.$today, false)){
\Auth::login($user_db);
}