账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    laravel 使用微博第三方登录,如何用code换token
    58
    0

    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'];
        }
    }
    
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 黎夕旧梦 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部