【问题标题】:How to Secure Laravel API (sanctum)如何保护 Laravel API (sanctum)
【发布时间】:2021-11-16 19:09:57
【问题描述】:

我有一个带有登录系统的 laravel 应用程序,仅供实习生使用 和 我有一个网站,它使用 api 从/向 laravel 应用程序获取和发布数据

所以我想要,只有我的网站可以从/向 api 获取/发布数据 -> laravel 应用程序

现在,我已经使用电子邮件和密码为 api 创建了一个登录用户。我知道那不是正确的做法。

通过此登录凭据,网站从 api 获取不记名令牌(有效期 10 分钟)

使用此不记名令牌(ajax 调用的标头),网站调用每个 api 请求(get/post)

代码:

Ajax 调用获取 Bearer Token:

 axios.post(data_source_url + "/auth/token", {'email' : 'api@email.de', 'password' : 'pw1'}).then((res) => {
        document.cookie = 'bearer=' + res.data + ';expires=' ...
    })

Laravel Api 路由:

Route::post('/auth/token', ['uses'=>'ApiController@getToken'])->name('api.getToken');
Route::get('/get', ['middleware'=>'auth:sanctum', 'uses'=>'Api\ApiController@read']);
Route::post('/send', ['middleware'=>'auth:sanctum', 'uses'=>'Api\ApiController@send']);

所以我想用不记名令牌进行授权,但是如何以正确/安全的方式从 api 发送和接收不记名令牌,因为我这样做的方式现在登录是完全不安全的

【问题讨论】:

    标签: javascript laravel


    【解决方案1】:

    您不应该让获取令牌的路线保持开放。这件事我写了一篇文章Laravel 8 REST API 这种方法允许您通过首先使用有效用户登录应用程序来获取令牌。对于您的用例,您只需删除注册路由和控制器,您就可以保护它以供您使用。

    路线

    Route::post('/login', [ApiController::class, 'login']);
    

    控制器

    public function login(Request $request) {
         if (!Auth::attempt($request->only('email', 'password'))) {
         return response()->json(['message' => 'Incorrect e-mail or password'], 401);
        }
    
        $user = User::where('email', $request['email'])->firstOrFail();
    
        $token = $user->createToken('auth_token')->plainTextToken;
    
        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
        ]);
    }
    

    我刚刚意识到您正在登录以检索承载。放心,标头是使用 HTTPS 加密的,所以据我所知是安全的。

    为了在js调用中删除明文用户和密码,需要通过发出npm install dotenv --save来安装dotenv

    现在添加到您的 .env 文件中

    MY_API_USER=api@email.de
    MY_API_PASSWORD=pw1
    

    然后你需要添加到你的文件中

    require('dotenv').config();
    

    所以你可以这样使用敏感数据

    axios.post(data_source_url + "/auth/token", {'email' : process.env.MY_API_USER, 'password' : process.env.MY_API_USER}).then((res) => {
        document.cookie = 'bearer=' + res.data + ';expires=' ...
    })
    

    您不会共享您的 .env 文件,如果不存在,请务必将其添加到您的 .gitignore 或类似文件中。

    【讨论】:

    • 是的,我知道标头是加密的,但每个人都可以阅读我的 .js 文件并获取电子邮件和密码
    • 哦,这很容易解决,只需使用 dotenv 并将敏感数据存储在 .env 文件中laravel.com/docs/8.x/configuration
    • 我的意思是对我的 laravel 应用程序的 ajax 调用。该网站是香草html/javascript
    • 抱歉,这里太早了。 npmjs.com/package/dotenv 你需要require('dotenv').config() 然后你可以用process.env.MY_API_USERprocess.env.MY_API_PASSWORD 检索你的数据
    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2017-10-12
    • 2021-05-18
    • 2021-05-05
    • 2019-09-13
    相关资源
    最近更新 更多