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

时间:2019-03-11 09:38:18

标签: laravel-passport

针对具有相同问题的人员的修复程序进行更新:

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

$this->middleware('auth);

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

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


原始帖子

您可能会在我的帖子历史中看到,这个问题困扰了我一阵子,我觉得我已经尝试了所有事情,所以我又来了。问题:

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

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调用具有正确的同步(数据:“数据”部分只是确保它没有将config参数作为data参数读取)。

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

唯一可疑的是我的两个oauth客户端的user_id为null。我不确定它们如何工作,因此我here对此进行了询问。克里斯·凯尔克(Chris Kelker)给出了我希望得到的答案,但由于无法确定如何直接更改护照中的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);
    }
}

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

针对具有相同问题的人的修复程序进行更新:

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

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

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