我有一个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错误。我要去哪里错了?由于相同的代码可在另一台服务器上使用。
答案 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设置中禁用了以下模块:
然后在httpd.conf文件中添加以下行(Linux / CentOS 7.6):
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
答案 2 :(得分:0)
将这些行放入您的 .htaccess 文件中,它肯定会起作用
RewriteCond %{HTTP:Authorization} 重写规则 .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]