首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Laravel中对Vue.js / Axios请求进行身份验证

如何在Laravel中对Vue.js / Axios请求进行身份验证
EN

Stack Overflow用户
提问于 2018-05-06 03:36:23
回答 3查看 17K关注 0票数 7

我在Laravel 5.6。我构建了所有的API路由,并正确响应来自REST客户端(Paw)的请求。我正在尝试构建一个简单的前端来访问这些路由。

我试图尽可能多地使用Laravel的开箱即用功能,所以我使用Axios从使用Vue.js的刀片模板调用这些路由。如果我在测试路由上禁用了auth中间件,它就会起作用,但是当为路由启用auth中间件时,我在控制台上会得到401个错误。

问题似乎很明显..。我的/api路由上的auth:api守卫希望在报头中看到oauth令牌,但当我使用网页登录时,它会执行会话身份验证。我假设有一种简单的方法来解决这个问题,而不必在web前端欺骗oauth令牌请求,对吧?我是否需要以某种方式在Axios的请求中传递会话令牌?如果是这样的话,我是否还需要更改我的API路由文件中的auth:api防护?

EN

回答 3

Stack Overflow用户

发布于 2018-05-07 08:02:27

我解决了!我有点尴尬,因为答案实际上在Laravel文档中,但我会说,我在这里发布问题之前尝试过这个方法,但它不起作用。也许当时还有别的东西坏了。

根据Laravel docs

您需要做的就是将CreateFreshApiToken中间件添加到app/Http/Kernel.php文件中的web中间件组中:

‘'web’=> //其他中间件...\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,,

此Passport中间件会将laravel_token cookie附加到您的传出响应。此cookie包含一个加密的JWT,Passport将使用它对来自JavaScript应用程序的应用编程接口请求进行身份验证。现在,您可以向应用程序的应用程序接口发出请求,而无需显式传递访问令牌...

票数 10
EN

Stack Overflow用户

发布于 2018-05-06 09:30:29

您可能希望使用Larvel Passport或JWT身份验证机制来获取Authorization令牌。

考虑到如何使用axios,添加一个请求拦截器,以便在成功进行身份验证后将访问令牌附加到每个请求。一个简单的例子:

代码语言:javascript
运行
复制
// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // assume your access token is stored in local storage 
    // (it should really be somewhere more secure but I digress for simplicity)
    let token = localStorage.getItem('access_token')
    if (token) {
       config.headers['Authorization'] = `Bearer ${token}`
    }
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });
票数 6
EN

Stack Overflow用户

发布于 2020-07-17 18:24:12

要首先使用auth:api,需要在users表中使用api_token

代码语言:javascript
运行
复制
Schema::table('users', function ($table) {
    $table->string('api_token', 80)->after('password')
                        ->unique()
                        ->nullable()
                        ->default(null);
});

您还可以创建用于测试的用户,如下所示

代码语言:javascript
运行
复制
User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'api_token' => Str::random(60),
    ]);

在您的布局中,在@yield('content')之前使用以下内容

代码语言:javascript
运行
复制
<script>
     window.Laravel = <?php echo json_encode(['api_token' => (Auth::user())->api_token]); ?>
</script>

现在,您可以在vue js中使用window.laravel.api_token在头部中使用它。

这里有一个例子

代码语言:javascript
运行
复制
var methods = new Vue({
    el: '#tabs_lists',
    data: {
        config: {
            headers: {
              Authorization: 'Bearer ' + window.Laravel.api_token,
              Accept: 'application/json'
            }
           },
        data: []
    },
    methods: {
        test: function (link) {
            axios.get(link, this.config)
               .then(response => (this.data = response.data)).catch(function (error) {
                // handle error
                console.log(error);
              });
        }
    }
}
  )
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50193349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档