我正在建造一个非常小的api。 在api中使用来自请求的基本认证头来认证请求。 这是我做过的代码
$headers = apache_request_headers() ;
// print_r($headers);
if(isset($headers['Authorization'])){
//$credentials = base64_decode($headers);
print_r($headers['Authorization']);
}
我将Authorization标头设为“Basic YXBpa2V5OmFqZWVzaA==
”现在我将如何检查此基本授权标头是否有效?
我应该用username:password格式解码base64字符串并用DB检查它,或者当生成用户名和密码时,是否必须将它存储为base64格式并将请求base64字符串与DB中的字符串进行比较?
我想知道验证基本身份验证请求的标准做法是什么?
请提出一些建议。我刚刚开始,请原谅问题愚蠢。
答案 0 :(得分:4)
我建议您使用api令牌而不是用户/密码组合。使用简单的身份验证令牌可以获得两个好处。
用户名或密码可能随时间而变化,如果是这样,用户被迫更改其应用程序中的所有用户名和密码,以使应用程序恢复工作。简单的令牌是常量,当用户的用户名和密码发生变化时,不需要任何更改。
使用基本身份验证,客户端需要以未加密的格式发送用户名+密码。这不是很安全,在最坏的情况下,未经授权的人可以使用请求中的用户名+密码登录服务后端。简单令牌仅对api调用有效。
为每个API用户生成一个简单的随机令牌,例如Eq57dwypZaFW4f2xxRzFaGjwCYinOn6l13Mvds00P2ZzgdMPTk
,并要求在每个api请求上使用请求标头发送此令牌,如
X-API-TOKEN: Eq57dwypZaFW4f2xxRzFaGjwCYinOn6l13Mvds00P2ZzgdMPTk
X-API-CLIENT-ID: 123456
在服务器端验证
<?php
$token = $_SERVER['X-API-TOKEN'];
$userID = $_SERVER['X-API-CLIENT-ID'];
$isValid = $findInDatabase->findToken($userID, $token);
if( $isValid )
{
// process api request
} else {
// invalid token
}