【问题标题】:Accessing credentials from username:password@example.com link从 username:password@example.com 链接访问凭据
【发布时间】:2013-03-20 13:16:43
【问题描述】:

我已经阅读了与此相关的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>';

这是我正在使用的示例代码。 Colin 建议添加RewriteRule 并没有影响结果。

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

RewriteRule 添加了额外的标头,但对于获取值不是必需的。看起来所有的魔力都在于如果。

【问题讨论】:

  • 你尝试过类似read URL; split by ":". [0] being username.replace("http://", ""); [1] being password.remove("@$")的方法
  • URL在到达目标之前被浏览器解析为简单的http://example.com,因此不能这样解析。
  • @psyketom 正如预期的那样。客户端的工作是从 URL 中获取这些凭据,将它们组合起来,对它们进行 base64 编码,然后在 Authorization 标头中将它们发送到服务器。但是您在$_SERVER['PHP_AUTH_USER'] 中没有得到任何信息?
  • 我知道应该将它们打捞到Auth 标头中,但是是的,我在PHP_AUTH_USER 中没有得到任何东西,甚至没有设置密钥。
  • @psyketom 你是把 PHP 作为 CGI 运行还是使用 mod_php?

标签: php apache http authentication


【解决方案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,请在“auth.php”中使用此代码 您将立即使用您的用户名登录,并在 URL 中提供通行证。 如果您直接访问网址,例如: http://yourdomain.com/auth.php 会出现一个弹窗询问用户名和密码,当你输入它们时,你将再次登录。使用:

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

现在获取输入的用户名和密码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2015-10-18
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多