成功生成令牌,但使用时仍然未授权

Successfully generating a token, but still getting unauthorized when using it

为遇到同样问题的人更新修复:

我终于获得了可以工作的令牌授权。我相信问题可能出在我的 UserController.php 中,我把

$this->middleware('auth);

在我的 __construct 方法中。我没有制作原始的 Laravel 应用程序,但我相信这个中间件来自那里,因为需要登录创建会话 cookie。

现在我的代码 posted 可以完美运行了!


原版post

正如您在我的 post 历史记录中看到的那样,这个问题困扰了我一段时间,我觉得我现在已经尝试了所有方法,所以我又来了。问题:

我已经使用 laravel-passport 设置了我的授权服务器,连接到 API 服务器。从 React SPA,我调用授权服务器(使用 axios,如果重要的话),我在其中发送一个用户名(这是一个电子邮件)和一个密码,如果被接受,returns 一个访问令牌.这一切都有效,现在我想发送请求以使用我的访问令牌检索数据。这是通过以下代码完成的:

var config = {
  headers: { 'Authorization': "Bearer " + accessToken }
};
await axios.get('http://apiServer/api/details', {data: 'data'}, config)
  .then(response => {
    console.log('user: ', response)
  })

调用路由

Route::middleware('auth:api')->group(function () {
  Route::get('/user', 'ApiController@getUser');
});

调用函数

    public function details()
{
    $user = Auth::user();
    return response()->json(['success' => $user], 200);
}

这不起作用,我收到了未经授权的 (401) 消息。 API 标记看起来是正确的,而且我很确定 axios 调用具有正确的语法(数据:'data' 部分只是确保它不会将配置参数读取为数据参数)。

我也尝试过使用构造的密码授予客户端显式使用密码授予令牌,但这会产生相同的错误。

唯一可疑的是我的两个 oauth 客户端都 user_id 为空。我不是 100% 确定它们是如何工作的,所以我询问了它 here。 Chris Kelker 给出了我所希望的答案,但我无法实现它,因为我不确定如何直接更改 passport 中的 oauth 文件,或者我是否应该这样做。

如果需要,我可以提供更多代码,我希望我不会在这个问题上发太多垃圾邮件。

提前致谢,理查德。

根据要求,这是生成令牌的代码:

    public function loginToken()
{
    if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
        $user = Auth::user();

        $success['token'] = $user->createToken('MyApp')->accessToken;
        return response()->json(['success' => $success], 200);
    } else {
        return response()->json(['error' => 'Unauthorised'], 401);
    }
}

在我的 React 应用程序中检索令牌的代码是:

const accessTokenData = await axios.post('http://my-app/api/loginToken', {email: 'myemail@email.com', password: 'myPassword'});
const accessToken = accessTokenData.data.success.token;

例如,您可以注销您发送的内容吗?您可能没有在发送前更新您的代币持有者变量。

为有同样问题的人更新修复:

我终于获得了可以使用的令牌授权。我相信问题可能出在我的 UserController.php 中,我把

$this->middleware('auth); 在我的 __construct 方法中。我没有制作原始的 Laravel 应用程序,但我相信这个中间件来自那里,因为需要登录创建会话 cookie。

现在我在下面发布的代码可以完美运行了!