【问题标题】:Guzzle post request to own server resulted in a `404 Not Found`对自己的服务器的 Guzzle 发布请求导致“404 Not Found”
【发布时间】:2020-07-10 00:04:05
【问题描述】:

我正在尝试登录我的 laravel 应用程序,该应用程序使用护照并添加 guzzle 以发布到我的 oath/token 路由,以便用户无需公开我的 secret_key 即可登录

但是我遇到了一个我似乎无法解决的错误

问题

我已经用护照更新了我的 laravel 应用程序,并在本地测试了我的后端,效果很好。在我将我的 laravel 应用程序部署到我的实时服务器测试环境后,我在尝试登录时开始出错。

起初 guzzle 无法验证我当前的实时环境的 SSL。所以我把验证变成了假。现在我开始得到一个不同的说法,它表明我的 url oath/token 路由是错误的。这是错误的,因为直接发布到我的“誓言/令牌”似乎对邮递员有用。

我还用php artisan route:list检查了路线是否存在

总结:guzzle 表示我要发布的网址不存在,但确实存在

我的获取令牌功能

  public function getToken(& $username, $password)
  {
    $http = new \GuzzleHttp\Client;

    try {
      $response = $http->post(config('services.passport.login_endpoint'), [
          //'verify' => false,
          'verify'  => ( env( 'APP_ENV' ) === 'local' ) ? false : true,
          'form_params' => [
              'grant_type' => 'password',
              'client_id' => config('services.passport.client_id'),
              'client_secret' => config('services.passport.client_secret'),
              'scope' => '',
              'username' => $username,
              'password' => $password,
          ]
      ]);
      return $response->getBody();
    } catch (\GuzzleHttp\Exception\BadResponseException $e) {
        if ($e->getCode() === 400) {
            return response()->json('Invalid Request. Please enter a username or a password.', $e->getCode());
        } else if ($e->getCode() === 401) {
            return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
        }
        return $e;
    }
  }

回应

GuzzleHttp\Exception\ClientException: Client error: `POST https: //my.domain.com/oauth/token` resulted in a `404 Not Found` response:

期待

每当Guzzle 向我现有的路由发布内容时,它都会从我的 laravel 应用返回响应。

添加调试

*   Trying {my ip adres}...
* TCP_NODELAY set
* Connected to {mydomain} {my ip adres} port 443 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=CH; L=Schaffhausen; O=Plesk; CN=Plesk; emailAddress=info@plesk.com
*  start date: Feb  9 14: 54: 36 2020 GMT
*  expire date: Feb  8 14: 54: 36 2021 GMT
*  issuer: C=CH; L=Schaffhausen; O=Plesk; CN=Plesk; emailAddress=info@plesk.com
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
> POST /oauth/token HTTP/1.1
Host: {mydomain}
User-Agent: GuzzleHttp/6.3.3 curl/7.58.0 PHP/7.1.33
Content-Type: application/x-www-form-urlencoded
Content-Length: 144

* upload completely sent off: 144 out of 144 bytes
< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Wed,
01 Apr 2020 17: 31: 26 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 266
< Connection: keep-alive
< 
* Connection #0 to host {mydomain} left intact
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache Server at my.domain.com Port 443</address>
</body></html>

路线

|        | POST      | oauth/token                                 | passport.token          | Laravel\Passport\Http\Controllers\AccessTokenController@issueToken                                  | throttle                                                             |
|        | GET|HEAD  | oauth/tokens                                | passport.tokens.index   | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser                           | web,auth                                                             |
|        | DELETE    | oauth/tokens/{token_id}                     | passport.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy                           | web,auth                                                             |

【问题讨论】:

  • 为什么:// 之间有一个额外的空格?
  • @AlwaysSunny 不知道源中没有空格。我也试过直接添加网址
  • 您尝试访问的路线如何使用 php artisan route:list 进行查看?
  • @mrhn 将其添加到问题中
  • @Salman 形成 curl 响应,看起来您的 nginx 网络服务器已经响应 404 页面。 nginx correclty 是否配置为匹配您的“主机名”?其他路由是否在相同的主机名上工作?您是否为此主机名配置了自定义 location 匹配项?

标签: php laravel post guzzle


【解决方案1】:

当我运行php artisan serve 时,我在post 中找到了解决方案,我可以致电'base_uri' =&gt; "127.0.0.1:8000"。所以我将它添加到supervisor 以运行php artisan serve,现在我可以调用我自己的服务器了。

显然我无法通过静态 PHP 调用我自己的服务器。

【讨论】:

    【解决方案2】:

    您是否尝试在配置的 login.endpoint 之前添加基本 url,例如:

    $response = $http->post(config('app.url'). config('services.passport.login_endpoint'), [
          ...
        ]
    ]);
    

    【讨论】:

    • 感谢您的回复。我试过直接把网址放在那里,我得到了同样的错误
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2020-07-01
    • 2015-09-05
    相关资源
    最近更新 更多