【问题标题】:Laravel passport returning Unauthenticated in production but works on localhostLaravel 护照返回在生产中未经身份验证,但在本地主机上工作
【发布时间】:2019-12-09 16:07:43
【问题描述】:

我有一个在 X 服务器上运行良好的 laravel 项目,并将相同的项目(相同的代码)放在另一个 Y 服务器上,令我惊讶的是,经过身份验证的路由不起作用,我总是收到未经身份验证的错误,为什么这会发生吗?

{
  "message":"Unauthenticated.",
  "success":false,
  "status_code":500
}

我使用了以下命令: - php工匠护照:安装 - php工匠配置:缓存 - php工匠缓存:清除 - php工匠密钥:生成

但我仍然收到未经身份验证的错误,令牌正在由前端正确传递,它是一个不记名令牌,此令牌是在用户使用 createToken ('myApi') -> accessToken 方法登录时生成的/p>

public function login(AuthLoginRequest $request)
{
    $user = User::with('role')->where(['email' => $request->email])->get()->first();
    if(!$user){
        abort(404, 'userNotFound');
    }

    if(!password_verify($request->password, $user->password)){
        abort(401, 'invalidCredentials');
    }

    $token = $user->createToken('MyApiToken')->accessToken;
    Access::customCreate($request->all(), $user);

    $response = [
        'id' => $user->id,
        'name' => $user->name,
        'email' => $user->email,
        'profile_image' => $user->profile_image,
        'token' => $token,
        'old_password_changed' => $user->old_password_changed
    ];

    return response()->json($response, 200);
}

登录代码运行良好,它返回了 Bearer 令牌,但是在使用此令牌发送任何请求后,我得到了未经身份验证的错误。我哪里错了?由于相同的代码可以在另一台服务器上运行。

【问题讨论】:

  • 我正在考虑卸载护照并安装 tymondesigns/jwt-auth
  • 您是如何使用不记名令牌发送子序列请求的?
  • 头授权承载TOKEN_HERE
  • 我怀疑是apache的问题。

标签: php laravel


【解决方案1】:

我有办法。

出了什么问题?

由于某种原因,Apache 服务器的模块忽略了 Authorization 标头,说这是为了安全(我不怀疑)。

我是怎么解决的?

我只是在 Apache 设置中禁用了以下模块:

  • mod_cgid
  • mod_fcgid
  • mod_proxy_scgi

在 httpd.conf 文件中我添加了这一行 (Linux/CentOS 7.6):

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

【讨论】:

【解决方案2】:

我怀疑可能存在 CORS(跨源资源共享)。请提供有关使用 API 的更多信息,您的前端(客户端)是否在同一个域中?不会有 CORS 问题,但如果您是前端,则与检查前端浏览器的 console 不同域。如果问题仍然存在,请尝试自行调试 Laravel。

我也遇到过类似的问题。添加以下内容为我解决了这个问题。 在app/Providers/AppServiceProvider.php

public function boot()
    {
        Passport::withoutCookieSerialization();
    }

还有app/Providers/AuthServiceProvider.php

 public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
        Passport::$ignoreCsrfToken = true;
    }

编辑:我的前端是 React js,我使用 axios http 客户端进行 API 调用,所以我添加了以下标头。我将令牌保存在本地存储中 像这样的东西

const token = localStorage.getItem('authKey');
config = {
            'Accept' : 'application/json',
            'Authorization' : `Bearer ` + token
        }
URL = 'your-api-url';

axios.get(URL, {headers : config})
            .then(res => {
              if (res.data && res.data.status === 1) {

              } 

            })
            .catch(e => {console.error(e); throw e;});
        }

【讨论】:

  • 您好,我按照您的提示操作了,但是没用,cors没有问题,因为我可以正常登录并消费其他公共端点。我在前端使用 vue,位于不同的域中(app.domain.com 和 api.domain.com)
  • 我怀疑是apache有问题。
【解决方案3】:

将这些行放入您的 .htaccess 文件中,它肯定会起作用

处理授权标头

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

【讨论】:

    【解决方案4】:

    有时可能是权限问题,如果您的服务器是基于 Linux 的,则授予对存储和缓存文件夹的完全访问权限即可。

    sudo chmod -R 777 storage bootstrap/cache

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2020-07-11
      • 2017-01-06
      • 2019-02-28
      • 2019-06-14
      • 2021-09-14
      • 2019-08-03
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多