laravel 自己的 api 使用来自具有承载令牌的控制器

Posted

技术标签:

【中文标题】laravel 自己的 api 使用来自具有承载令牌的控制器【英文标题】:laravel own api consumption from controller with bearer token 【发布时间】:2019-11-24 00:42:02 【问题描述】:

我喜欢在 Laravel 中通过 api 进行 crud 操作。因此,移动应用程序/Web 应用程序都可以使用相同的 api 端进行 crud 操作。出于 api 安全目的,我使用的是护照。我在使用邮递员调用 api end 时成功,而在我尝试从 laravel 控制器调用 api end 时得到空输出。我正在尝试使用不记名令牌。

在前面我有 laravel 刀片视图。我已经在 laravel 中安装了护照。我在 api.php 中创建了几个 api 端点 其中之一是 /user/id,它启用了 auth:api 中间件。

我有 web.php

 Route::get('profile', 'UserController@profile')->middleware('auth');

所以我的想法是从配置文件控制器向 /api/user/1 发送带有不记名令牌的请求

为了获取不记名令牌,我使用 Request create /oauth/token from login controller

if (Auth::attempt(['email' => request('email'), 'password' => 
request('password')])) 
        $user = Auth::user();
    if(Auth::check())   
           $req = Request::create('/oauth/token', 'POST',[
                     'grant_type' => 'password',
                     'client_id' => 2,
                     'client_secret' => 'WDv6wrY9Tf9HuixaiQjDWGy7yBqEG1IrmsLucAUI',
                    'username' => request('email'),
                    'password' => request('password'),
                    'scope' => '*' 
           ]);
                    $res = app()->handle($req);
                   $responseBody = json_decode($res->getContent()); // convert to json object
                  return response()->json(['success' => $responseBody], $res->getStatusCode());

            else 
            return response()->json(['error' => 'Not logged in '], 401);
          

    

它返回我的不记名令牌。我正在传递这个不记名令牌并尝试从 laravel 配置文件控制器使用自己的 api

$token  ='eyJ0eXAiOiJKV1QiLCJhbGciOi...';
$req = Request::create('/api/user/1', 'GET',[
      'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '.$token,

      ],

    ]);
    $res = app()->handle($req);
   $profile_details = json_decode($res->getContent()); // convert to json object


    return response()->json(['profile' =>$profile_details], $res->getStatusCode());

输出是

 "profile":null 

status code302

当我通过post manhttp://localhost:8000/api/user/1打电话时

把Authorization Bearer Token值和之前一样

eyJ0eXAiOiJKV1QiLCJhbGciOi.....

我收到以下回复


"data": 
    "id": 1,
    "first_name": "rajib",
    "last_name": "chow",
    "address": "207 Eryn Coves",
    "city": "South Treva",
    "country": "Luxembourg",
    "phone": "(397) 400-2302 x6997",
    "fax": "82928",
    "user_id": 1,
    "created_at": "2019-06-26 15:03:31",
    "updated_at": "2019-06-26 15:03:31"
    

我的api路由是

Route::get('/user/id', function ($id) 
return new UserResource(User::find($id)->customer);
)->middleware('auth:api');

如果我再次从代码中删除中间件('auth:api'),它将在我的控制器上运行

Route::get('/user/id', function ($id) 
return new UserResource(User::find($id)->customer);
); 

上面给我预期的输出

但出于安全目的,我认为我应该将不记名令牌与 api 调用一起传递。 如何从控制器发出 api 调用以及不记名令牌

【问题讨论】:

【参考方案1】:

试试这个代码

$request = Request::create('/api/user/1', 'GET');
    $request->headers->set('Accept', 'application/json');
    $request->headers->set('Authorization', 'Bearer '.$token);
    $res = app()->handle($request);
    $profile_details = json_decode($res->getContent()); // convert to json object


    return response()->json(['profile' =>$profile_details], $res->getStatusCode());

【讨论】:

以上是关于laravel 自己的 api 使用来自具有承载令牌的控制器的主要内容,如果未能解决你的问题,请参考以下文章

验证来自 laravel 8 api 中两个以上表的用户

来自 laravel api 的外部 phpmyadmin

laravel passport是否在承载令牌中序列化整个用户对象?

如何使用具有相同控制器的 Laravel 制作网站和 API REST?

具有 Relation 和 Eloquent 的 Laravel Api 资源

Google People API:请求具有无效的身份验证凭据 - 未设置授权承载标头