如何从PHP验证RESTful JWT API

时间:2015-09-13 07:51:04

标签: rest laravel cookies jwt

我有一个由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());

1 个答案:

答案 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