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'];
}
}
官方文檔說(shuō)的很清楚了。
$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);
昨晚仔細(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é)果
獲取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"
}
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。