【问题标题】:How is basic authentication header validated/checked in a rest api如何在 rest api 中验证/检查基本身份验证标头
【发布时间】:2014-11-06 07:03:43
【问题描述】:

我正在构建一个非常小的 API。 在 api 中,我使用来自请求的基本身份验证标头对请求进行身份验证。 这是我已经完成的代码

$headers = apache_request_headers() ;
//  print_r($headers);
if(isset($headers['Authorization'])){
        //$credentials = base64_decode($headers);
        print_r($headers['Authorization']);
}

我的授权标头是“Basic YXBpa2V5OmFqZWVzaA==”现在我将如何检查这个基本授权标头是否有效? 我应该以用户名:密码格式解码base64字符串并使用数据库进行检查,还是在生成用户名和密码时,我是否必须将其存储为base64格式并将请求base64字符串与数据库中的字符串进行比较?

我想知道验证基本身份验证请求的标准做法是什么?

请提出一些想法。我刚刚开始,请原谅我的愚蠢问题。

【问题讨论】:

    标签: php api rest authorization basic-authentication


    【解决方案1】:

    我建议您使用 api 令牌而不是用户/密码组合。使用简单的身份验证令牌,您可以获得两个好处。

    1. 用户名或密码可能会随着时间而改变,如果是这样,用户必须更改其应用程序中的所有用户名和密码才能使应用程序恢复工作。一个简单的令牌是不变的,当用户的用户名和密码改变时不需要任何改变。

    2. 使用基本身份验证,客户端需要以未加密格式发送用户名 + 密码。这不是很安全,在最坏的情况下,未经授权的用户可以使用请求中的用户名 + 密码登录服务后端。简单令牌仅对 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
    }
    

    【讨论】:

    • 非常感谢您的回复。我对此有疑问,所以这个令牌是客户的登录凭据吧?
    • 你说的是 Oauth 2.0 吗?
    • no oauth 描述您的应用程序仅将其用户凭据发送一次到服务器并获得时间有限的access_token 以响应对 api 的调用。这个简单的令牌为每个用户生成一次并存储在您的数据库中,如果用户想要进行 api 调用,则使用您的数据库中存储的令牌检查此令牌
    • 感谢您的回复:)
    • 有关更多信息,您可以查看github.com/WhiteHouse/api-standards - 关于rest api 标准的一个不错的小文档
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多