猿问

laravel 使用微博第三方登录,如何用code换token

laravel的项目、第三方登录使用了SocialiteProviders这个库、以及这个库带的socialiteproviders/weibo插件,目前能实现获取到微博返回的code和state。

接下来需要在我定义callback方法中用code换token,代码如下,但是没有思路,请教一下各位大佬该怎么弄,谢谢啦,感谢感谢

    public function weibocallback() {
        $oauthUser = \Socialite::with('weibo')->user();
        
        var_dump($oauthUser->getId());
        var_dump($oauthUser->getNickname());
        var_dump($oauthUser->getName());
        var_dump($oauthUser->getEmail());
        var_dump($oauthUser->getAvatar());

    }

SocialiteProviders/weibo 的代码我也贴出来了,麻烦大佬们帮忙看下,如下:

<?php

namespace SocialiteProviders\Weibo;

use SocialiteProviders\Manager\OAuth2\User;
use Laravel\Socialite\Two\ProviderInterface;
use SocialiteProviders\Manager\OAuth2\AbstractProvider;

class Provider extends AbstractProvider implements ProviderInterface
{
    /**
     * Unique Provider Identifier.
     */
    const IDENTIFIER = 'WEIBO';

    /**
     * {@inheritdoc}.
     */
    protected function getAuthUrl($state)
    {
        return $this->buildAuthUrlFromBase('https://api.weibo.com/oauth2/authorize', $state);
    }

    /**
     * {@inheritdoc}.
     */
    protected function getTokenUrl()
    {
        return 'https://api.weibo.com/oauth2/access_token';
    }

    /**
     * {@inheritdoc}.
     */
    protected function getUserByToken($token)
    {
        $response = $this->getHttpClient()->get('https://api.weibo.com/2/users/show.json', [
            'query' => [
                'access_token' => $token,
                'uid' => $this->getUid($token),
            ],
        ]);

        return json_decode($this->removeCallback($response->getBody()->getContents()), true);
    }

    /**
     * {@inheritdoc}.
     */
    protected function mapUserToObject(array $user)
    {
        return (new User())->setRaw($user)->map([
            'id' => $user['idstr'], 'nickname' => $user['name'],
            'avatar' => $user['avatar_large'], 'name' => null, 'email' => null,
        ]);
    }

    /**
     * {@inheritdoc}.
     */
    protected function getTokenFields($code)
    {
        return array_merge(parent::getTokenFields($code), [
            'grant_type' => 'authorization_code',
        ]);
    }

    /**
     * {@inheritdoc}.
     */
    public function getAccessToken($code)
    {
        $response = $this->getHttpClient()->post($this->getTokenUrl(), [
            'query' => $this->getTokenFields($code),
        ]);

        $this->credentialsResponseBody = json_decode($response->getBody(), true);

        return $this->parseAccessToken($response->getBody());
    }

    /**
     * @param mixed $response
     *
     * @return string
     */
    protected function removeCallback($response)
    {
        if (strpos($response, 'callback') !== false) {
            $lpos = strpos($response, '(');
            $rpos = strrpos($response, ')');
            $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
        }

        return $response;
    }

    /**
     * @param $token
     *
     * @return string
     */
    protected function getUid($token)
    {
        $response = $this->getHttpClient()->get('https://api.weibo.com/2/account/get_uid.json', [
            'query' => ['access_token' => $token],
        ]);

        return json_decode($response->getBody(), true)['uid'];
    }
}
侃侃无极
浏览 438回答 4
4回答

慕斯709654

官方文档说的很清楚了。 Laravel Socialite 获取用户相关信息 $user = Socialite::driver('github')->user(); // OAuth2 Providers $token = $user->token; $refreshToken = $user->refreshToken; // not always provided $expiresIn = $user->expiresIn; // All Providers $user->getId(); $user->getNickname(); $user->getName(); $user->getEmail(); $user->getAvatar(); 从 token 获取用户信息 $user = Socialite::driver('github')->userFromToken($token);

子衿沉夜

你是不会用PHP发送http请求???CURL或者Guzzle库
随时随地看视频慕课网APP
我要回答