我第一次与Laravel Sanctum合作,尤其是与API的合作。我必须创建仅用于返回JSON的报告的API,这是POSTMAN无法访问的主题,因为它告诉我"message": "Unauthenticated."
我按照我的项目文档告诉我的配置步骤进行了操作。
我遵循了文档在我的项目中告诉我的配置步骤,即安装Sanctum,运行提供程序,创建令牌迁移,在用户Sanctum模型中引用并放置HasApiTokens,此时我不这样做。不知道该怎么办。
一方面,文档告诉我可以放置此行token = $user->createToken('token-name');
来进行访问,但我不知道将其放置在何处,因为它没有接口,因为目的是通过PowerBi
这是我的路线API
Route::group(['middleware'=> 'auth:sanctum'], function (){
Route::get('/reports','Api\ReportController@getTicketsCotizados');
});
我的控制器
public function __construct()
{
$this->middleware('auth');
}
public function getTicketsCotizados(){
$this->authorize('view ticket');
$cotizados =Ticket::ticketWithLeadForStatus(3)->get();
return response()->json($cotizados, 200);
}
内核
'api' => [
EnsureFrontendRequestsAreStateful::class,
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
用户
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use Notifiable, UsesTenantConnection, HasApiTokens, HasRoles;
(...)
}
卫兵
'api' => [
'driver' => 'sanctum',
'provider' => 'users',
'hash' => false,
],
答案 0 :(得分:0)
该命令应该在后端执行,用于创建传递给用户的令牌,以用于将来的访问。
我不精通安全最佳实践,但我认为您需要创建一个登录 api 路由,在接收电子邮件和密码并返回令牌以进一步使用的密室之外。
在您的情况下,您可以使用 TINKER(laravel 的交互外壳)快速生成令牌,仅用于测试,只需在项目根目录的命令行中键入以下内容:
php artisan tinker
$user = User::find([replace_with_user_accessing_api_id]);
$user->createToken('[replace_with_random_name]');
现在,您可以获取 plainTextToken 并将其放置在 Postman 的授权选项卡中,在 Bearer Type 下。
答案 1 :(得分:0)
如果您在此处阅读 Laravel 文档 https://laravel.com/docs/8.x/sanctum,它有一个非常清晰的示例,可以生成访问令牌并使用它发出请求。是的,没有明确的提出请求的例子,它只是指使用不记名令牌,因为他们假设您精通这些事情。
要充分利用像 Laravel 这样的多功能框架,您必须仔细浏览每一页关于某事的内容,不要遗漏他们为帮助您处理事情而写的任何信息或文字。
在生成令牌的控制器/路由部分之后。他们已经将其编写为在路由中使用,但如果您可以遵循 Laravel 基础知识,则可以将其移至控制器。
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
Route::post('/sanctum/token', function (Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['The provided credentials are incorrect.'],
]);
}
return $user->createToken($request->device_name)->plainTextToken;
});
请记住,当生成令牌时,这是您唯一可以查看普通令牌以供进一步使用的时间。请参阅上面代码中的 plainTextToken。如果您不保存此令牌,则无法使用它。
好的。我假设您看到并复制了这个看起来像 123|p45xhFOkNFPXR7QhXjupWRffKDds2b7dpXDB0Vzz
的令牌。在这个标记中,开头的 123 是用管道 (|) 分隔的用户 ID。您需要提取它以仅使用本示例中以 p45 开头的令牌。
在实际应用中,您将此令牌传递/返回到来自移动设备或前端的登录请求,并将其保存在会话或相关数据存储中。
接下来,要向由 auth:sanctum
保护的路由区域/url 发出进一步请求,您必须通过 Authorization 标头以承载形式传递此令牌。有关使用 fetch
方法的示例,请参阅 Setting authorization header in Fetch API。我正在张贴一张图片,展示您如何在邮递员中调用它。
如果我在没有设置 Authorization 标头的情况下发出此请求,它也会返回我
{
"message": "Unauthenticated."
}
我希望我说得够清楚了。