Laravel护照在生产中返回未经身份验证但可在本地主机上工作

时间:2019-08-01 05:55:40

标签: php laravel

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

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

我使用了以下命令: -PHP Artisan护照:安装 -php artisan config:缓存 -php artisan缓存:清除 -php artisan键:生成

但是我仍然收到未经身份验证的错误,令牌已由前端正确传递,它是承载令牌,当用户使用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令牌,但是在使用该令牌发送任何请求后,我得到了Unauthenticated错误。我要去哪里错了?由于相同的代码可在另一台服务器上使用。

3 个答案:

答案 0 :(得分:1)

我怀疑可能存在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;});
        }

答案 1 :(得分:0)

我有解决办法。

出了什么问题?

由于某种原因,Apache服务器具有忽略Authorization标头的模块,说这是出于安全性考虑(我对此毫不怀疑)。

我如何解决?

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

  • mod_cgid
  • mod_fcgid
  • mod_proxy_scgi

然后在httpd.conf文件中添加以下行(Linux / CentOS 7.6):

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

答案 2 :(得分:0)

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

处理授权头

RewriteCond %{HTTP:Authorization} 重写规则 .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]