LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?
Posted
技术标签:
【中文标题】LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?【英文标题】:LARAVEL & VUE: How can I get the API_TOKEN of the logged in user with an API request? 【发布时间】:2019-10-28 19:18:34 【问题描述】:我有一个使用 VUE 和 LARAVEL 5.8 的 SPA 我已经设置了一个与登录用户关联的 API_TOKEN。登录后一切正常。我得到了 API_TOKEN,我将它保存到一个 var 中,并与 Axios 请求一起发送。在 Laravel 中,我有一个中间件负责处理令牌并将其与登录用户的设置进行比较。
问题发生在会话到期时。因为我仍然可以浏览私人页面并发出 API 请求来保存和删除内容。我认为这是可能的,因为我仍然在 var 中保存了相同的 API_TOKEN,并且中间件显然没有得到会话已过期。
所以我想在每次执行 Ajax 时获取 API_TOKEN,请求因此当会话过期时,我将无法获取令牌,因此我将无法完成请求。
这是我的设置。
web.php
是我唯一指向singlePageController
的php 路由:
Auth::routes();
Route::get('/any', 'SinglePageController@index')->where('any', '.*');
然后在singlePageController
我返回视图:
class SinglePageController extends Controller
public function index()
return view('app', ['loggedUser' => auth()->user()]);
然后我有 api.php
我有 API 路由。正如你在最后看到的,我有中间件将其设为私有。举个例子,这是我用来更新内容的例子:
Route::put('event/update/slug', 'EventController@update')->middleware('auth:api');
然后是那个 API 路由的相关控制器:
public function update(Request $request, $slug)
$event = Event::where('slug', $slug)->first();
$event->title = $request->input('title');
return new EventResource($event);
最后,这是我用来定义 API 数据的显示内容和方式的资源:
public function toArray($request)
// return parent::toArray($request);
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'curator' => $this->curator,
'featured_image' => $this->featured_image,
'body' => $this->body,
'date' => $this->date
];
以上就是我的流程。然后,当我进行 axios 调用以更新内容时,我正在执行以下操作:
axios(
method: 'PUT',
url: '/api/event/update/' + this.$route.params.slug + '?api_token=' + this.isLogged.apiToken,
data: dataToSave,
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
)
.then((response) =>
this.getNotification('Success: The Event has been saved');
)
.catch((error) =>
this.getNotification('Error: Impossible saving the event');
console.log(error);
)
你知道怎么做吗?或者是否有更好的方法来实现?
【问题讨论】:
你能发布你的中间件代码吗? 就是这个laravel.com/docs/5.8/api-authentication#protecting-routes。但我不知道在哪里可以找到代码,因为它是在 Laravel 中构建的,而且显然它不在 Laravel 拥有的中间件之一中。我添加了我当前的设置 【参考方案1】:你喜欢,你的登录方式应该是这样的。
public function login(Request $request)
if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']]))
$user = Auth::user();
$success = $user->createToken(config('app.name'))->accessToken;
return response()->json(["token" => $success, 'status' => 200]);
else
return response()->json(['message' => "Email or Password do not match"], 401);
【讨论】:
我添加了我当前的设置 您获得访问令牌了吗? 令牌不是问题。我要在执行 Ajax 请求时检查会话是否有效。这是关于会话,而不是令牌。 @rolfo85 检查会话是否有效,您可以在路由中使用 auth 中间件,要检查令牌是否有效,您可以在 api 路由中使用 api:auth 中间件 它不起作用。我将更新 API 路由包装到此 Route::group(['middleware' => ['auth:api', 'auth']], function() ... 但是如果我手动删除会话并尝试立即保存它,它保存没有错误。如果我反转并首先放入中间件“auth”,我会收到 401 错误。我认为这就是为什么在 Ajax 请求中没有会话信息,所以当 auth中间件正在检查它,它没有找到任何东西并抛出 401。以上是关于LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?的主要内容,如果未能解决你的问题,请参考以下文章