Laravel api 授权与 api_token
Posted
技术标签:
【中文标题】Laravel api 授权与 api_token【英文标题】:Laravel api authorization with api_token 【发布时间】:2017-07-23 00:23:24 【问题描述】:我正在尝试创建一个 Laravel API 项目。所以我有这个项目,它设置了基本的 laravel 脚手架。在我的用户迁移中,我添加了:
$table->string('api_token', 60)->unique();
然后在我的 User.php 模型中我添加了:
protected $fillable = [
'name', 'email', 'password','api_token'
];
然后在我的 api.php 中我做了一个测试路线:
Route::group(['middleware' => ['auth:api']], function()
Route::get('/test', 'ApiController@test');
);
在我的 Apicontroller 中:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ApiController extends Controller
public function test(Request $request)
return response()->json(['name' => 'test']);
所以现在我输入这个:用我的 api_token
localhost/project1/public/api/test?api_token='hsvdvhvsjhvasdvas8871238'
它没有给我 json 数据,而是重定向到登录的主页
【问题讨论】:
试试 localhost/project1/test? 感谢 SteD 的回复..我修复了它。这是我犯的一个愚蠢的错误。没有在路由中包含 /api。但现在我有另一个问题,请查看我编辑的问题。 @SteD 抱歉,又犯了愚蠢的错误。我修好了 :) 再次抱歉,我的坏处应该多一点耐心,哈哈。 【参考方案1】:localhost/project1/public/index.php/api/test?api_token='hsvdvhvsjhvasdvas8871238'
会有所帮助。
如果您想要漂亮的网址,请阅读文档:Pretty URLs
【讨论】:
通过 GET 参数发送令牌是不安全的做法。【参考方案2】:对于 laravel 5.2 中间件/ApiAuthenticate
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class ApiAuthenticate
public function handle($request, Closure $next, $guard = null)
if (Auth::guard($guard)->guest())
return response()->json(['status'=>'error','message'=>'token mismatch']);;
return $next($request);
kernel.php 添加
protected $routeMiddleware = [
'autho' => \App\Http\Middleware\ApiAuthenticate::class,
];
路由.php
Route::group(['prefix'=>'api','middleware'=>'auth:api'], function()
路线::get('aaa','Api\AAAController@index');
);
【讨论】:
【参考方案3】:如果您使用 Laravel 5.3 或更高版本,则无需编写自己的 API 中间件和路由。
此外,您可以使用内置的Passport 包来管理访问令牌,使用oAuth2。
$http = new GuzzleHttp\Client;
$response = $http->post($apiUrl.'oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2', //this can be generated when you setup Passport package or using artisan commands
'client_secret' => 'xxxxxxxxx', //this can be generated when you setup Passport package or using artisan commands
'username' => 'a@a.com',
'password' => 'test123',
'scope' => '',
],
]);
$responseData = json_decode($response->getBody(), true);
$token = $responseData['access_token']; //Now I have the token so I can call any protected routes
$response = $http->request('GET', $apiUrl.'api/v1/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$token,
],
]);
$responseData = json_decode($response->getBody(), true);
echo "Name of the user is: ".$responseData['name'];
【讨论】:
感谢 tanay jha 的回复。我尝试按照护照文件进行操作。但这有点难,因为它在谈论 vue.js 和 gulp 前端的东西。这很令人困惑。 @MohamedManas 你真的不需要使用 Vue.js,只有当你希望你的前端基于 Vue.js 时才需要。请参阅我编辑的答案。以上是关于Laravel api 授权与 api_token的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.8 新用户注册时无法生成 api_token
Laravel 5.3 集成 dingo api 和 oauth2 未找到列:1054 Unknown column 'api_token' in 'where Clause'