一个月后,VKontakte 对 Laravel 项目的授权停止工作。使用了社交名流包。现在,当我登录时,我收到此错误:
VkontakteProvider.php 第 92 行中的 InvalidStateException:
我查看了VK返回的内容,原来是302错误。
由于令牌的生命周期已经结束,我理解该错误。
它在这里抛出一个错误:
if ($this->hasInvalidState()) {
throw new InvalidStateException();
}
但是我的知识不足以理解为什么,你能解释一下吗?
这是错误页面:
这是文件VkontakteProvider.php:
<?php
namespace Laravel\Socialite\Two;
use Exception;
use Illuminate\Support\Arr;
class VkontakteProvider extends AbstractProvider implements ProviderInterface
{
protected $fields = ['uid', 'first_name', 'last_name', 'screen_name', 'photo'];
/**
* Unique Provider Identifier.
*/
const IDENTIFIER = 'VKONTAKTE';
/**
* {@inheritdoc}
*/
protected $scopes = ['email'];
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase(
'https://oauth.vk.com/authorize', $state
);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl()
{
return 'https://oauth.vk.com/access_token';
}
/**
* {@inheritdoc}
*/
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->get(
'https://api.vk.com/method/users.get?user_ids='.$token['user_id'].'&fields='.implode(',', $this->fields).'&https=1'
);
$response = json_decode($response->getBody()->getContents(), true)['response'][0];
return array_merge($response, [
'email' => Arr::get($token, 'email'),
]);
}
/**
* {@inheritdoc}
*/
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => Arr::get($user, 'uid'), 'nickname' => Arr::get($user, 'screen_name'),
'name' => trim(Arr::get($user, 'first_name')),
'email' => Arr::get($user, 'email'), 'avatar' => Arr::get($user, 'photo'),
]);
}
/**
* {@inheritdoc}
*/
protected function getTokenFields($code)
{
return array_merge(parent::getTokenFields($code), [
'grant_type' => 'authorization_code',
]);
}
/**
* {@inheritdoc}
*/
protected function parseAccessToken($body)
{
return json_decode($body, true);
}
/**
* {@inheritdoc}
*/
public function user()
{
if ($this->hasInvalidState()) {
throw new InvalidStateException();
}
$user = $this->mapUserToObject($this->getUserByToken(
$token = $this->getAccessTokenResponse($this->getCode())
));
return $user->setToken(Arr::get($token, 'access_token'))
->setExpiresIn(Arr::get($token, 'expires_in'));
}
/**
* Set the user fields to request from Vkontakte.
*
* @param array $fields
*
* @return $this
*/
public function fields(array $fields)
{
$this->fields = $fields;
return $this;
}
/**
* {@inheritdoc}
*/
public static function additionalConfigKeys()
{
return ['lang'];
}
}


您没有通过 API 版本。从 2018 年初开始,API 版本必须转移到.
而不是这些行:
应该是这样的:
在所有其他地方也是如此。版本可以在开头和结尾都传递 - 没关系。
当然,最好不要对每个 URL 中的版本参数进行硬编码,而是从某个常量中获取它。
工作 VKontakteProvider 类的示例。