!!!!转载请注明作者和本文链接!!!!
上一篇说到使用Passport提供的参数发起获取token的请求已经成功了。但是如果是像我们项目这种前后端分离的系统,做Api认证,会出现一个问题:
假设访问A Server的接口需要通过passport的认证,如果前端或者其他业务Server向A Server请求token,就需要把client_id和client_secret这些参数都带上,这样就不太合理了。
我们更希望是可以根据项目或者业务的特点来设计认证相关的Api,包括参数,返回内容以及中间件,同时又能使用passport的相关功能。
下面我们来说一下如何实现这个目标,仍然以A Server为例,即访问A Server的Api需要先向AServer请求token。
首先我们需要明确一点,passport的使用是从前端或者另一端发送请求到A Server进行处理的。如果是A Server自己想使用passport的接口,就需要A Server自己向passport的接口发起请求。如下:
public function getAccessTokenFromPassportV1()
{
//注意:上一篇我们把passport的路由前缀已经改成了api/oauth,你的项目里passport前缀是啥,你就用啥
$url="https://你的host"."/api/oauth/token";
//这里就是一串passport接口要求的参数
$params=["grant_type"=>"client_credentials",
"client_id"=>"1",
"client_secret"=>"XXXXXXX",
"scope"=>""];
//下面是使用GuzzleHttp\Client发起post请求
$http = new Client;
$params=[RequestOptions::JSON =>$postParam];//也可以用form-data,看项目的需要
$response=$http->post($url,$params);
//请求结果转json
$result=json_decode((string) $response->getBody(), true);
return $result;
}
这样passport token的相关返回结果就到手了,但是这里是只有一个client。如果是多个client,我们可以再修改一下。
public function getAccessTokenFromPassportV2($myParam)
{
//注意:上一篇我们把passport的路由前缀已经改成了api/oauth,你的项目里passport前缀是啥,你就用啥
$url="https://你的host"."/api/oauth/token";
//这里就是一串passport接口要求的参数
$params=getClientInfo($myParam);
//下面是使用GuzzleHttp\Client发起post请求
$http = new Client;
$params=[RequestOptions::JSON =>$postParam];//也可以用form-data,看项目的需要
$response=$http->post($url,$params);
//请求结果转json
$result=json_decode((string) $response->getBody(), true);
return $result;
}
public function getClientInfo($myParam)
{
//这里你可以根据myParam和passport client的关系,去获取相关的passport client
return ["grant_type"=>"client_credentials",
"client_id"=>"XXX",
"client_secret"=>"YYY",
"scope"=>""];
}
我们这个时候需要新建一个获取token路由,并给路由分配好controller以及相关处理请求的函数,比如
routes/api.php
Route::get('/access/token','AccessController@getAccessToken') //get或者post,可以根据项目要求定
Http/Controllers/AccessController.php
class AccessController extends Controller
{
public function getAccessToken(Request $request)
{
//1.获取参数
$myParam=$request->input("my_param");
//2.调用我们之前实现的获取Passport Access Token的函数
$result=getAccessTokenFromPassportV2($myParam);
//3.按项目要求处理返回值,并返回,比如:
return response()->json($result,200,[],JSON_FORCE_OBJECT);
}
}
done了
参考文章:
Laravel 5.5 使用 Passport 实现 Auth 认证
!!!!转载请注明作者和本文链接!!!!