鍍金池/ 問(wèn)答/Java  PHP  網(wǎng)絡(luò)安全/ laravel 使用微博第三方登錄,如何用code換token

laravel 使用微博第三方登錄,如何用code換token

laravel的項(xiàng)目、第三方登錄使用了SocialiteProviders這個(gè)庫(kù)、以及這個(gè)庫(kù)帶的socialiteproviders/weibo插件,目前能實(shí)現(xiàn)獲取到微博返回的code和state。

接下來(lái)需要在我定義callback方法中用code換token,代碼如下,但是沒(méi)有思路,請(qǐng)教一下各位大佬該怎么弄,謝謝啦,感謝感謝

    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 的代碼我也貼出來(lái)了,麻煩大佬們幫忙看下,如下:

<?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'];
    }
}
回答
編輯回答
尛憇藌

你是不會(huì)用PHP發(fā)送http請(qǐng)求???CURL或者Guzzle庫(kù)

2018年7月28日 18:26
編輯回答
青瓷

官方文檔說(shuō)的很清楚了。

Laravel Socialite


獲取用戶相關(guān)信息

$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);
2018年4月18日 15:09
編輯回答
失魂人

昨晚仔細(xì) 看了一下,發(fā)現(xiàn)問(wèn)題出在自己這里。下面詳細(xì)說(shuō)一下正確的做法;
正確的callback:

class AuthController extends Controller{
    public function weibo() {        
        return Socialite::with('weibo')->redirect();
    }

    public function weibocallback() {
        $oauthUser = Socialite::with('weibo')->user();

        dd($oauthUser);
    }

因?yàn)橛昧薼aravel的第三方package :SocialiteProviders/weibo,問(wèn)題中有貼出這個(gè)包的源碼,這個(gè)包本身已經(jīng)集成了相關(guān)的一些功能,所以我們?cè)谑褂?dd($oauthUser) 就可以直接打印出獲取的token,等于這個(gè)包幫我們直接完成了code換token的過(guò)程,所以說(shuō)這個(gè)包的集成度很高,附上鏈接socialiteproviders.github.io大家可以自己看文檔。
下附dd()函數(shù)的輸出結(jié)果

clipboard.png

2017年2月15日 09:47
編輯回答
清夢(mèng)

獲取code(你已獲取)、應(yīng)用認(rèn)證信息(client_id & client_secret)到Authorization Server換取access_toke

https://api.weibo.com/oauth2/authorize?            client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
YOUR_CLIENT_ID:即應(yīng)用的AppKey,可以在應(yīng)用基本信息里查看到。
YOUR_REGISTERED_REDIRECT_URI:即之前填寫(xiě)的授權(quán)回調(diào)頁(yè),注意一定要完全相同。

換取Access Token
開(kāi)發(fā)者可以訪問(wèn)如下頁(yè)面得到Access Token:
https://api.weibo.com/oauth2/...
這些參數(shù)就不一一介紹了。
如果都沒(méi)有問(wèn)題,就可以得到Access Token了,返回示例:
{

  "access_token": "ACCESS_TOKEN",
  "expires_in": 1234,
  "remind_in":"798114",
  "uid":"12341234"

}

2018年2月18日 19:01