N窬!!G钏臁函匕!轉(zhuǎn)載請(qǐng)注明作者和本文鏈接!r胶凇V严А!
???????上一篇說(shuō)到使用Passport提供的參數(shù)發(fā)起獲取token的請(qǐng)求已經(jīng)成功了忌穿。但是如果是像我們項(xiàng)目這種前后端分離的系統(tǒng)抒寂,做Api認(rèn)證,會(huì)出現(xiàn)一個(gè)問(wèn)題:
假設(shè)訪問(wèn)A Server的接口需要通過(guò)passport的認(rèn)證掠剑,如果前端或者其他業(yè)務(wù)Server向A Server請(qǐng)求token屈芜,就需要把client_id和client_secret這些參數(shù)都帶上,這樣就不太合理了。
我們更希望是可以根據(jù)項(xiàng)目或者業(yè)務(wù)的特點(diǎn)來(lái)設(shè)計(jì)認(rèn)證相關(guān)的Api井佑,包括參數(shù)属铁,返回內(nèi)容以及中間件,同時(shí)又能使用passport的相關(guān)功能躬翁。
下面我們來(lái)說(shuō)一下如何實(shí)現(xiàn)這個(gè)目標(biāo)焦蘑,仍然以A Server為例,即訪問(wèn)A Server的Api需要先向AServer請(qǐng)求token姆另。
首先我們需要明確一點(diǎn)喇肋,passport的使用是從前端或者另一端發(fā)送請(qǐng)求到A Server進(jìn)行處理的。如果是A Server自己想使用passport的接口迹辐,就需要A Server自己向passport的接口發(fā)起請(qǐng)求。如下:
public function getAccessTokenFromPassportV1()
{
//注意:上一篇我們把passport的路由前綴已經(jīng)改成了api/oauth甚侣,你的項(xiàng)目里passport前綴是啥明吩,你就用啥
$url="https://你的host"."/api/oauth/token";
//這里就是一串passport接口要求的參數(shù)
$params=["grant_type"=>"client_credentials",
"client_id"=>"1",
"client_secret"=>"XXXXXXX",
"scope"=>""];
//下面是使用GuzzleHttp\Client發(fā)起post請(qǐng)求
$http = new Client;
$params=[RequestOptions::JSON =>$postParam];//也可以用form-data,看項(xiàng)目的需要
$response=$http->post($url,$params);
//請(qǐng)求結(jié)果轉(zhuǎn)json
$result=json_decode((string) $response->getBody(), true);
return $result;
}
這樣passport token的相關(guān)返回結(jié)果就到手了殷费,但是這里是只有一個(gè)client印荔。如果是多個(gè)client,我們可以再修改一下详羡。
public function getAccessTokenFromPassportV2($myParam)
{
//注意:上一篇我們把passport的路由前綴已經(jīng)改成了api/oauth仍律,你的項(xiàng)目里passport前綴是啥,你就用啥
$url="https://你的host"."/api/oauth/token";
//這里就是一串passport接口要求的參數(shù)
$params=getClientInfo($myParam);
//下面是使用GuzzleHttp\Client發(fā)起post請(qǐng)求
$http = new Client;
$params=[RequestOptions::JSON =>$postParam];//也可以用form-data实柠,看項(xiàng)目的需要
$response=$http->post($url,$params);
//請(qǐng)求結(jié)果轉(zhuǎn)json
$result=json_decode((string) $response->getBody(), true);
return $result;
}
public function getClientInfo($myParam)
{
//這里你可以根據(jù)myParam和passport client的關(guān)系水泉,去獲取相關(guān)的passport client
return ["grant_type"=>"client_credentials",
"client_id"=>"XXX",
"client_secret"=>"YYY",
"scope"=>""];
}
我們這個(gè)時(shí)候需要新建一個(gè)獲取token路由,并給路由分配好controller以及相關(guān)處理請(qǐng)求的函數(shù)窒盐,比如
routes/api.php
Route::get('/access/token','AccessController@getAccessToken') //get或者post草则,可以根據(jù)項(xiàng)目要求定
Http/Controllers/AccessController.php
class AccessController extends Controller
{
public function getAccessToken(Request $request)
{
//1.獲取參數(shù)
$myParam=$request->input("my_param");
//2.調(diào)用我們之前實(shí)現(xiàn)的獲取Passport Access Token的函數(shù)
$result=getAccessTokenFromPassportV2($myParam);
//3.按項(xiàng)目要求處理返回值,并返回蟹漓,比如:
return response()->json($result,200,[],JSON_FORCE_OBJECT);
}
}
done了
參考文章:
Laravel 5.5 使用 Passport 實(shí)現(xiàn) Auth 認(rèn)證
?缓帷!F狭!份殿!轉(zhuǎn)載請(qǐng)注明作者和本文鏈接!K越弧G涑啊!