使用Laravel Passport做Api认证(三)——自定义请求参数和回包

!!!!转载请注明作者和本文链接!!!!

       上一篇说到使用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 认证

!!!!转载请注明作者和本文链接!!!!

你可能感兴趣的:(使用Laravel Passport做Api认证(三)——自定义请求参数和回包)