社交名流刷新代币

问题描述 投票:0回答:2

我正在构建一个 Laravel 应用程序,我需要用户能够连接社交渠道,例如 Twitter、Twitch、YouTube 等。我不需要他们能够使用这些媒体登录,但需要连接它们,所以我的应用程序可以获得访问令牌以从其社交渠道检索信息。

我开始使用 Socialite 连接 Twitch,但我注意到他们的令牌过期了,而且我也收到了刷新令牌。

我遵循社交名流关于处理无效令牌的建议,而不是关注它何时过期。我遇到的问题是..如何用社交名流刷新令牌?我似乎找不到可以从refresh_token获取新令牌的方法。

谁能告诉我这是否内置于 Socialite 中,或者我是否必须自己构建它,甚至使用 Socialite 之外的其他东西?

laravel token laravel-socialite
2个回答
4
投票

刷新代币不取决于 Laravel Socialite。

这是您在授权服务器上执行的操作。

如果是 Twitch,请参阅:https://dev.twitch.tv/docs/authentication/refresh-tokens/

每个社交提供商都有自己的端点。但它们都应该遵循 OAuth2 RFC

在 Laravel 中,你可以像这样使用 Guzzle:

$http = new GuzzleHttp\Client;

$response = $http->post('https://id.twitch.tv/oauth2/token', [
    'form_params' => [
        'grant_type'    => 'refresh_token',
        'refresh_token' => '<your refresh token>',
        'client_id'     => '<your client ID>',
        'client_secret' => '<your client secret>',
        'scope' => '',
    ],
]);

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

P.s.快速查看后,似乎您可以使用 \SocialiteProviders\Twitch\Provider 中的 getAuthUrl() 方法动态检索此 URL,但这不在 Contract...


0
投票

对于任何其他正在寻找

refreshToken()
方法的人,您可以扩展 Provider 类并添加类似的内容:

<?php

namespace App\Socialite\SomeProvider;

use SocialiteProviders\SomeProvider\Provider as SomeProviderProvider;

class Provider extends SomeProviderProvider
{
    public function refreshToken($refreshToken)
    {
        $response = $this->getHttpClient()->post(
            $this->getTokenUrl(),
            [
                'headers' => [
                    'Accept' => 'application/json',
                ],
                'form_params' => [
                    'grant_type' => 'refresh_token',
                    'refresh_token' => $refreshToken,
                    'client_id' => $this->clientId,
                    'client_secret' => $this->clientSecret,
                ],
            ]
        );

        return json_decode($response->getBody(), true)['access_token'];
    }
}

然后你就可以像这样使用它:

Socialite::driver('someprovider')->refreshToken($refresh_token);
© www.soinside.com 2019 - 2024. All rights reserved.