我有一个由JWT控制的Laravel RESTful API,我想从另一个路由验证它。这是代码:
//Route.php
Route::group(['prefix' => 'api'], function() {
Route::resource('authenticate', 'AuthenticateController', ['only' => ['index']]);
Route::post('authenticate', 'AuthenticateController@authenticate');
Route::get('authenticate/user', 'AuthenticateController@getAuthenticatedUser');
});
Route::get('/login', 'LoginController@index');
//Login.blade.php
<form action="http://domain.dev/api/authenticate" method="post">
<input type="text" name="email">
<input type="password" name="password">
</form>
现在因为我正在使用JWT,我得到一个需要存储在cookie中的令牌。然后,一旦用户登录,他们就应该被重定向到另一个视图,并且用户将在每个请求上将此标记作为标头发送。
我已经google了很多但是找不到任何实际显示如何从PHP而不是JS框架发出正确请求的教程。
编辑:我现在正在使用Guzzle和OAuth2。这是我提出的请求,但它抛出错误: // This request works and it is just a simple route that returns a user.
$client = new Client();
$request = $client->createRequest('GET', 'http://example.dev/user');
$response = $client->send($request);
dd($response);
// This one doesn't work, I don't know why. I have confirmed that the request
// does send the post fields but the api responds with a 500. Although it does
// work with POSTMAN. I have also tried sending it as Header but still doesn't work
$client = new Client();
$response = $client->post('http://example.dev/oauth/access_token', [
'body' => [
'grant_type' => 'password',
'client_id' => '1',
'client_secret' => '12345',
'username' => 'user@gmail.com',
'password' => 'password123',
]
]);
dd($response->json());
答案 0 :(得分:0)
通常,您应该在外部使用API。您拥有业务逻辑,然后公开API以使用它。没关系。但是,如果您正在同一个Laravel项目中工作,那么调用API&#34;它就没有任何意义。就像外部应用程序一样:你已经在项目环境中了!
您应该像使用 Guzzle 这样的内容来调用您的API,就像外部服务一样,但您可以让服务器完成两次工作。
我会做什么
如果在内部工作&#34;在我的项目中,我不使用API。它们是为其他外部应用程序创建的接口。不适用于应用程序本身。 :)
你能做什么
所以,即使我不建议你这样做,但考虑一下你的行动,这是一个解决方案。
您可以使用Guzzle。
更多信息:
正如您所看到的,您可以自由设置标题并根据您的需求创建完美的请求,但它没有任何意义。
显然,您无法在内部使用会话,因为您正在使用基于令牌的身份验证系统。因此,使用中间件将cookie注入您的内部&#34;请求,然后像往常一样使用它。
以下是中间件句柄方法主体的示例。您可以使用 merge 方法将您选择的数组与现有请求数据合并。
public function handle(Request $request)
{
// getting the token
$token = $request->cookie('token');
// inject your token in the current request
$request->merge(['token' => $token]);
}
请勿忘记添加一些验证数据,以确保该令牌存在且您可以使用它。
希望它有所帮助!
编辑:只是为了得到一个完整的答案...如果您不知道如何创建中间件,check this out。