我正在尝试在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
吗?
也许我误会了什么,你们能给我一个暗示吗?谢谢
答案 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);
}
}