开发者问题收集

Laravel 护照刷新令牌

2018-12-14
8655

我使用的是 Laravel 5.5 版,使用 Passport 进行身份验证。 我已成功创建令牌,并可以使用 auth:api 中间件访问它。

但每当用户登录系统时,它都会为该用户创建新令牌。我只想刷新用户的最后一个令牌并将其发回,而不是创建新令牌。

我已使用以下代码生成身份验证令牌

$token = $user->createToken('string-'.$user->id)->accessToken;

它生成了 1075 个字符的令牌,但当我检查数据库表 oauth_access_tokens 时,它显示了 80 个字符的令牌。

如何使用 80 个字符的令牌获取最后生成的令牌并刷新它并将其发回?

提前致谢

2个回答

如果您的应用程序颁发了短期访问令牌,则用户需要通过颁发访问令牌时提供给他们的刷新令牌来刷新其访问令牌。在此示例中,我们将使用 Guzzle HTTP 库来刷新令牌:

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);

/oauth/token 路由将返回包含 access_token、 refresh_tokenexpires_in 属性的 JSON 响应。expires_in 属性包含访问令牌过期前的秒数。

Ismoil Shifoev
2018-12-14

我做过类似的事情。

创建了一个授予刷新令牌的端点。 在我的控制器中,

public function userRefreshToken(Request $request)
{
$client = DB::table('oauth_clients')
    ->where('password_client', true)
    ->first();

$data = [
    'grant_type' => 'refresh_token',
    'refresh_token' => $request->refresh_token,
    'client_id' => $client->id,
    'client_secret' => $client->secret,
    'scope' => ''
];
$request = Request::create('/oauth/token', 'POST', $data);
$content = json_decode(app()->handle($request)->getContent());

return response()->json([
    'error' => false,
    'data' => [
        'meta' => [
            'token' => $content->access_token,
            'refresh_token' => $content->refresh_token,
            'type' => 'Bearer'
        ]
    ]
], Response::HTTP_OK);
}
Usama Munir
2020-01-01