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 phpunit 测试与 api 令牌认证

Laravel - 在标题中发送 api_token

Laravel 5.8 新用户注册时无法生成 api_token

Laravel 5.3 集成 dingo api 和 oauth2 未找到列:1054 Unknown column 'api_token' in 'where Clause'

php api_token 与 user_token 简析

如何更改令牌保护中的 api_token 列