使用PDO身份验证器,Slim 3的HTTP基本身份验证失败

时间:2016-10-17 06:55:54

标签: php pdo basic-authentication slim http-basic-authentication

我正在使用Slim v 3和JWT编写REST API。我跟着https://github.com/tuupola/slim-jwt-auth,它运行正常。

每次用户登录appl时,我都会生成一个令牌。为了对用户进行身份验证,我按照https://github.com/tuupola/slim-basic-auth使用auth中间件。成功后,我使用https://github.com/firebase/php-jwt生成令牌。

我在这里搜索了一个相关问题,JWT: Authentication in slim v3 and Android我对http basic auth进行了查询。 (我没有足够的代表在那里发表评论)。

现在我的问题:

  1. 通过'用户' HttpBasicAuthentication选项工作正常,但我无法明显地使用它对我的用户表。许多用户将登录该应用程序并在“用户”中列出所有这些应用程序。不是一种选择。我在这儿吗?

  2. 如果是,我必须使用Pdo身份验证器。我配置它但身份验证失败,我无法解决它。错误回调是用"身份验证失败"信息。我的数据库有'用户'表'用户'并且'哈希'用户名和密码的列。以下是我正在使用的代码。

  3. use Slim\Middleware\HttpBasicAuthentication;
    use Slim\Middleware\HttpBasicAuthentication\PdoAuthenticator;
    
    $pdo = new \PDO('mysql:host=localhost;dbname=test', $dbUser, $dbPassword);
    
    $middlewareHttpBasicAuthConfig = [
            /*"users" => [
                "user1" => "password"
            ],*/
            "secure" => false,
            "relaxed" => ["localhost", "amruta-pani"],
            "path" => "/*",
            "passthrough" => Utils::httpAuthPassThroughRoutes,
            "realm" => "Protected",
    
            "authenticator" => new PdoAuthenticator([
                "pdo" => $pdo
            ]),
    
            "callback" => function($request, $response, $arguments) {
                echo "Through<br>\n";
                print_r($arguments);
            },
    
            "error" => function($request, $response, $arguments) {
                echo "Failed<br>\n";
                print_r($arguments);
            }
        ];
    
    
        $app->add(new HttpBasicAuthentication($middlewareHttpBasicAuthConfig));
    

    我正在使用Google Advanced Rest Client进行测试,我看到的输出是

    Failed<br>
    Array
    (
        [message] => Authentication failed
    )
    

    我已将以下规则添加到我的Apache网络服务器

    RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    

    我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

您似乎需要按照blog post中的说明将数据库命名方案传递给PdoAuthenticator。

在你的情况下,这将是......

"authenticator" => new PdoAuthenticator([
    "pdo" => $pdo,
    "table" => "users",
    "user" => "user",
    "hash" => "hash"
])

......这似乎确实是默认值。由于简单的底层PDO连接问题,它可能无法正常工作。此外,查看source,PdoAuthenticator在内部使用password_verify(),因此它仅在PHP 5&gt; = 5.5.0和PHP 7中可用。

你也可以推出自己的身份验证器。关于在自己的身份验证器回调中处理凭据的问题,您可以执行以下操作:

class MyAuthenticator implements AuthenticatorInterface {
    public function __invoke(array $arguments) {
        // $arguments['user'] will contain username
        // $arguments['password'] will contain password
        // Do stuff...
    }
}

答案 1 :(得分:0)

@Mika Tuupola帮助我在评论中解决了这个问题并且归功于他,我认为这会对某人有所帮助。我希望他能回答我的标记。

应密码密码,以便HTTPBasicAuthentication中间件正常工作。 无法使用PDO驱动程序对明文密码进行身份验证,但是,如果配置数组具有“users”属性,并且具有如下所示的明文密码,则在生产中显然不会出现这种情况。

$app->add(new \Slim\Middleware\HttpBasicAuthentication([
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

https://github.com/tuupola/slim-basic-auth上的GitHub文档足以使用这个中间件但是当它提到明文密码时,引用 -

  

明文密码仅适用于快速测试。你可能......

我使用PDO用明文密码进行测试,直到密码被散列后它才能正常工作。