从用户名访问凭据:password@example.com链接

时间:2013-03-20 13:16:43

标签: php apache http authentication

我已阅读PHP site中与此相关的页面,但我希望访问usernamepassword,而不指定之前的标题,因此显示表单并导致之后重新加载。

我希望这个usernamepassword传递可以选择性地传递。我的目标是让我的管理用户依赖这些凭据。因此,我不想打开example.com/admin进行登录,然后在显示管理功能的情况下重定向回example.com,我想阅读这些凭据并从这些凭据登录,如果匹配的话。

我有var_dump'ed $_SERVER$_ENV,但请求http://username:password@example.com不会在任何地方显示。

我正在运行PHP作为CGI。

我该如何完成这项工作?

更新

<?php

/*if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
}*/

echo '<pre>';

$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null;
$pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null;
var_dump( $user, $pass );

var_dump($_SERVER, $_ENV);

echo '</pre>';

以下是我正在使用的示例代码。科林建议添加RewriteRule并不影响结果。

这里的问题是,如果if部分被注释掉,我会获得$ user和$ pass的NULL值。如果我取消评论,我会得到正确的价值。

RewriteRule会添加额外的标头,但对于获取值并非必不可少。看起来所有的魔法都是如此。

1 个答案:

答案 0 :(得分:1)

我认为这正是您所寻找的:

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo '<pre>';
    print_r ($_SERVER); 
    echo '</pre>';
    echo '<hr>';
    echo 'Username: ' . $_SERVER['PHP_AUTH_USER'];
    echo '<br>Pass: ' . $_SERVER['PHP_AUTH_PW'];
}

因此,如果您访问http://yourusername:yourpass@yourdomain.com/auth.php,请使用#34; auth.php&#34;中的此代码 您将立即使用URL中提供的用户名和密码进行记录。 如果你直接访问网址如下: http://yourdomain.com/auth.php会出现一个弹出窗口,询问用户名和密码,当您输入时,您将再次登录。使用:

$_SERVER['PHP_AUTH_USER']
$_SERVER['PHP_AUTH_PW']

现在输入用户名和密码。

请记住,当您登录一次后,您的会话仍然存在,并且要测试密码提示框,您需要按&#34; CTRL + SHIFT + N&#34;打开一个新的隐身窗口。然后输入裸URL yourdomain.com/auth.php