首页 > 解决方案 > Laravel Passport:401 未经身份验证,但加密密钥相同

问题描述

我在将应用程序部署到新站点的 Passport 身份验证中遇到了一个奇怪的问题,尽管我之前没有遇到过这个问题。

我正在使用 Passport 的密码授予功能来登录应用程序(Laravel 5.4)。这发生在用户将他的用户名/密码作为 JSON 发布到站点,然后从那里将这些凭据发布到 OAuth/token 以获取站点的 API 密钥。这在过去运行良好,并且我的 OAuth 密钥已提交到存储库。

前几天,我设法将站点部署到新服务器(使用相同的 OAuth 密钥),重新生成(我认为)应用程序密钥,加载具有加密密码的数据,并且身份验证工作正常。然而,今天我在不同的分支上做了同样的事情,现在登录返回 401 Unauthorized。

我几乎完成了我能想到的所有排列:删除 OAuth 密钥、重新生成应用程序密钥、重新安装护照,但应用程序拒绝登录。我不相信它与源代码有任何关系,因为没有更改我在这个分支上做的会影响登录系统。

我什至尝试将工作站点的应用程序密钥和 OAuth 密钥复制到损坏的站点仍然不起作用。

让我更加困惑的是,我有另一个站点,它具有不同的应用程序密钥、不同的 OAuth 密钥,但数据相同,并且登录系统工作正常。

我对联盟/oauth2 软件包的了解不足以理解为什么这不起作用。我错过了什么?

谢谢,马特

标签: phplaraveloauth-2.0

解决方案


好吧,糟糕的代码是不值得的。

我没有提到的是,我尝试部署的站点是尝试将域移至新服务器。损坏的站点和它的活动姊妹站点都具有相同的域名。这是发布到我自己的域/oauth/token端点的代码:

$username = Input::json('username');
$password = Input::json('password');

$page = Input::get('page');

$client = Client::find(2);

$http = new GuzzleHttp\Client();

try {
    $response = $http->post(url('oauth/token'), [   # <-- see the problem?
        'form_params' => [
            'grant_type'    => 'password',
            'client_id'     => '2',
            'client_secret' => $client->secret,
            'username'      => $username,
            'password'      => $password,
            'scope'         => '',
        ],
    ]);

#...

这个问题比较搞笑。由于该站点的 DNS 尚未切换,因此对我自己站点的请求将转到旧站点,而不是这个。因此我要回来了Unauthenticated。因为我不是。

解决方案是编辑/etc/hosts服务器上的文件以将域指向自身。这样,任何对它自己的 api 的调用实际上都会转到它自己的 api。问题解决了。


推荐阅读