Laravel 5.2身份验证令牌

时间:2018-06-12 15:05:14

标签: php laravel rest authentication laravel-5.2

我正在尝试在Laravel 5.2中实现基于令牌的身份验证。我所做的是:

routes.php文件

Route::group([
    'middleware' => ['auth:api']
], function() {
    Route::get('/api/reservation', 'apiController@get');
});

我修改了用户模型并添加了api_token字段,并通过seeders添加了一个随机字符串的新用户:

移植

Schema::table('users', function (Blueprint $table) {
            $table->string('api_token', 60)->unique()->nullable()->default(null);
        });

播种机

User::create([
            ...,
            'api_token' =>  str_random(60),
        ]);

控制器

class apiController extends Controller
{
    function get(Request $request) {
        return Reserva::all();
    }
}

然后,在Postman中,我尝试使用我在数据库中的令牌获取/api/reservation?api_token=xxxxx的URL,但我总是得到 Unauthorized 。奇怪的是,如果我在身份验证中间件上执行dd($this->auth),我会得到TokenGuard name='web'个对象。不应该是api吗?

也许我误会了什么,你们能给我一个暗示吗?谢谢

2 个答案:

答案 0 :(得分:1)

您使用的auth:api中间件使用Laravel Passport。如果您想要基于自定义令牌的身份验证,则无法使用它,就像您创建自己的令牌一样。

如果您想使用Passport,请执行以下操作:

保持这样的路线。需要身份验证的路由必须位于auth:api中间件内。

您可以删除api_token表格的users字段。迁移中的$table->rememberToken()函数与您认为的API令牌完全不同。实际上,令牌根本不存储在数据库中。您在数据库的oauth_access_token表中看到的令牌不是您用于HTTP请求的令牌。

请勿像您一样创建自定义令牌。检查用户的登录/密码对是否有效,生成令牌并将其返回给API的使用者:

if (Auth::attempt(['login' => $req->login, 'password' => $req->password])) {
    $user = Auth::user();
    $token = $user->createToken('ToutelaBreizh')->accessToken;
    return response()->json(['token' => $token],200);
}

小心将登录/注册路由放在auth:api中间件的OUTSIDE之外,否则你需要给一个应该给你这个令牌的路由一个令牌 - 这没有任何意义。

接下来,请确保将令牌发送到请求的Authorization标头中的API,而不是像您那样发送到请求参数中。在Postman中添加以下标题:

Authorization: Bearer your_token_retrieved_before

现在你已经完成了很多工作,你可以将你的API与Postman一起使用。

答案 1 :(得分:0)

如果其他人遇到此问题。我的问题出现在<?php namespace Vendor\NewsExt\Userfuncs; use GeorgRinger\News\Domain\Model\News; /** * Class Tca */ class Tca { /** * Loads a custom title for the news list view * * @return void */ public function customTitle(&$parameters, $parentObject) { # fetch all categories assigned to this news $result = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 'sys_category.uid, sys_category.title', 'sys_category', 'sys_category_record_mm', $parameters['table'], 'AND sys_category_record_mm.tablenames = "' . $parameters['table'] . '" ' . 'AND sys_category_record_mm.fieldname = "categories" ' . 'AND sys_category_record_mm.uid_foreign = ' . $parameters['row']['uid'] ); # walk the categories an get the title of them $categoriesLabels = []; foreach ($result->fetch_all(MYSQLI_ASSOC) as $category) { $categoriesLabels[] = $category['title']; } # if at least one category put them into the title if (!empty(array_filter($categoriesLabels))) { $record = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord($parameters['table'], $parameters['row']['uid']); $parameters['title'] = $record['title'] . ' ('. implode(', ', $categoriesLabels) .')'; } } } 中间件中。我不知何故有一个旧版本。

我有这个Authenticate中间件:

Authenticate

我通过改变它来解决它:

class Authenticate
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login');
            }
        }

        return $next($request);
    }
}