通过 api.php 的路由返回未经授权,而通过 web.php 的相同路由有效

Posted

技术标签:

【中文标题】通过 api.php 的路由返回未经授权,而通过 web.php 的相同路由有效【英文标题】:Routes going through api.php returning unauthorised whereas the same route going through web.php works 【发布时间】:2021-05-05 00:59:06 【问题描述】:

我有一个允许用户创建“文件夹”的页面。我正在使用下面的函数来获取属于每个用户的所有文件夹,因此当用户登录时,他们应该看到他们的所有文件夹,但看不到其他用户的文件夹。

/**
 * Retrieve all user folders
 *
 * @return Response
 */
public function getAll()

    // notes associated to folder included
    return Folder::where('user_id', Auth::user()->id)->get();

这是用于加载所有文件夹的 vue 页面的样子:

<template>
    <v-app id="inspire">
        <v-card v-for="folder in folders" :key="folder.id">
            <v-card-text>
                Name:  folder.name 
            </v-card-text>
        </v-card>
    </v-app>
</template>

<script>
import  mapState  from "vuex";

export default 
    computed: 
        ...mapState(['folders'])
    ,

    mounted() 
        this.$store.dispatch('getAllFolders');
    
;
</script>

getAllFolders 方法如下所示:

getAllFolders() 
    apiClient.get(window.routes['folders.getAll'])
    .then(function(response)
        console.log(response)
    )
    .catch(function(error)
        console.error(error);
    );
,

将路由添加到 web.php 是可行的,并且允许每个用户查看他们的相关文件夹:

Route::get('folders/get-all', 'FolderController@getAll')->name('folders.getAll');

但是将其添加到 api.php 会导致未经授权的错误:

  Route::middleware(['auth:api'])->group(function ()      
      Route::get('folders/get-all', 'FolderController@getAll')->name('folders.getAll');
      Route::apiResource('folders', FolderController::class);
);

我可能做错了什么?

【问题讨论】:

你是否在每个请求中传递了一些令牌? 是的,标头中存在 X-XSRF-TOKEN 这不是身份验证令牌...“api”守卫期望某种类型的令牌来验证用户身份 用户表有一个 api_token 列,每个用户都存在? 好的,那么您需要将该令牌与每个请求一起发送到 api 【参考方案1】:

Api 路由是无状态的,它们专为来自第 3 方的请求而设计,并且需要一个身份验证令牌,您可以使用 Laravel Sanctum 之类的包生成该令牌。

见:https://laravel.com/docs/8.x/sanctum#api-token-authentication

如果您从自己的前端执行 ajax 请求,那么这会增加不必要的复杂性。坚持web.php,它不应用 api 中间件,并添加你自己的前缀,这样你就可以区分你的 html 和 ajax 端点。即'/data/user_folders'

【讨论】:

以上是关于通过 api.php 的路由返回未经授权,而通过 web.php 的相同路由有效的主要内容,如果未能解决你的问题,请参考以下文章

未经授权的用户在使用 phpunit 测试时返回状态 500 而不是 401

摘要身份验证返回未经授权的

未经授权响应的AngularJS(1.1.5)无限循环

Keycloak PUT 请求返回 401(未经授权)

带有 JWT 的 Express API 返回“未经授权:算法无效错误”

春季启动返回 401-未经授权,即使我允许它