如何在没有 SPA 或图形界面的情况下,仅通过 POSTMAN 访问 Laravel Sanctum 的 API 路由?

Posted

技术标签:

【中文标题】如何在没有 SPA 或图形界面的情况下,仅通过 POSTMAN 访问 Laravel Sanctum 的 API 路由?【英文标题】:How can I access the API routes with Laravel Sanctum without a SPA or graphic interface, only by POSTMAN? 【发布时间】:2021-01-07 16:30:11 【问题描述】:

我是第一次使用 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,
        ],

邮递员

【问题讨论】:

【参考方案1】:

该命令应该在后端执行,它用于创建传递给用户的令牌,以供将来访问时使用。

我并不精通安全最佳实践,但我认为您需要创建一个登录 api 路由,在接收电子邮件和密码并返回令牌以供进一步使用的圣殿之外。

在您的情况下,您可以使用 TINKER(laravel 的交互式 shell)快速生成令牌并仅用于测试,只需在项目根目录的命令行中键入以下内容:

php artisan tinker
$user = User::find([replace_with_user_accessing_api_id]);
$user->createToken('[replace_with_random_name]');

现在,您可以获取 plainTextToken 并放置在 Postman 的 Authorization Tab 中,在 Bearer Type 下。

【讨论】:

【参考方案2】:

如果您在此处阅读 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。我正在发布一张图片,显示您如何在邮递员中调用它。

如果我在没有设置授权标头的情况下发出此请求,它也会返回我


    "message": "Unauthenticated."

我希望我已经足够清楚了。

【讨论】:

以上是关于如何在没有 SPA 或图形界面的情况下,仅通过 POSTMAN 访问 Laravel Sanctum 的 API 路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有模板引擎的情况下构建 SPA Spring 应用程序

请问在登录Linux时不能启动图形界面的情况下如何设置默认桌面环境

在React SPA中打开图形元标记和SEO

linux如何启动图形界面

Ubuntu如何进行图形模式和文本模式的切换

如何在没有数据或仅使用预测系数的情况下保存 glm 结果?