我希望你一切都好。自从使用Laravel Passport几天以来,我一直在努力,试图用javascript / vuejs消耗我自己的api。过去的傍晚花了很多时间阅读有关我的问题的所有现有帖子,但是我找不到任何解决方案。希望您能帮助我,谢谢您。
我已经安装了一个新的laravel应用程序,并按照Laravel 5.8(https://laravel.com/docs/5.8/passport#introduction)的官方文档中的描述安装了Laravel Passport。我已经在不同的应用程序中多次完成了教程中的每个要点,但没有成功。为了测试我的设置,我使用了这个小的axios请求。
axios.get('/oauth/clients')
.then(response => {
console.log(response);
}).catch(error => {
console.log(response);
})
当我登录时,它工作正常,当我使用承载令牌并使用邮递员测试'/ oauth / clients'时,它也很好,但是当我未登录时,它总是返回401 Unauthenticated。我的目标是创建一个api,我可以以未经身份验证的用户身份从我自己的应用程序使用它,而无需持有者令牌,但不能从外部使用。我认为Laravel Passport是正确的方法。
我的请求标头:
:authority: laravel.dev
:method: GET
:path: /oauth/clients
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
cache-control: no-cache
cookie: XSRF-TOKEN=eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0%3D; laravel_session=eyJpdiI6IlpKc3EyS2R4NjAyM0t5XC8xaTR6SjJBPT0iLCJ2YWx1ZSI6Im1JRlRReVFHQ01jTlNQT3BkYlI1V0dNeE1BMkVvODhnWXNjM1VPRUFBRWRBRnl1N1diUmpOSkVJUmc0NTdsVFgiLCJtYWMiOiI0ZTZkNzE2OGQ5MzJkY2FmYzEzOWZiYjA3YTRiM2MxOGQ3OGJmNWIzMTI4ODA5MDMxYWVlMjJmOTk1M2FjZDdlIn0%3D
pragma: no-cache
referer: https://laravel.dev/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
x-csrf-token: 4Opsva9oDk6LkAapLGqqh9AuPzWKfVH4PYoxcMB1
x-requested-with: XMLHttpRequest
x-xsrf-token: eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0=
响应头:
cache-control: no-cache, private
content-type: application/json
date: Sun, 07 Jul 2019 19:05:25 GMT
server: nginx/1.15.5
set-cookie: XSRF-TOKEN=eyJpdiI6IklTWEkrRTJxYXpiRFNQUm0zM3RLYWc9PSIsInZhbHVlIjoiMDEzSmVlMldQOXBrVUQxQjlCUGVVN2dpUk9VWmwrUlRjend3XC9CaUk1S2V6dUFlTDZtVWttREV5cVBPOFwveVQ0IiwibWFjIjoiZWZhMzA3OGVhYmY2NWNjNjgyMTg4NzAxZjQzNWYxZGQyMjVmMWY3MjAwNjllZTM5ODFiNjFiNWY1NGFjOGM0NiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/
set-cookie: laravel_session=eyJpdiI6IlFLUDN0bGhBNW1UTytlbGgrcEZ0ekE9PSIsInZhbHVlIjoibHFvM09CSTFyZ05Kd0E0REVCekNOYmRocm01cnBVY3h1YjFOaXpyTXVcL05QSTNYdFFBdVpXZHd4NDVURGwralwvIiwibWFjIjoiYzM0ZWNhNzQ5MTJhY2VmNTZjZmM1YjFiNTgzYjU0NmZhZGIzZjVjYTFkOGNjYWEwNDEwODUyMzc5OWI2Njc3YiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/; httponly
status: 401
重要提示:我已经与我的一个朋友共享了该项目,他在Docker容器中与Laravel一起在MacO上工作,并且授权在他的设备上工作而没有任何更改。我在Laravel Homestead的Windows机器上运行。这个问题可能是Laravel Homestead或nginx引起的吗?
答案 0 :(得分:1)
使用“ web”和“ auth”中间件在“ oauth”前缀(例如,/ oauth / any-route)下定义了路由“ oauth / clients”。这说明了为什么未登录时会收到401错误,因为“身份验证”中间件失败了。
/vendor/laravel/passport/src/RouteRegistrar.php
<table>
<tbody>
<tr>
<td>
<font size="28">td</font>
</td>
</tr>
</tbody>
</table>
此外,您不应将“ Web”中间件用于API路由。该API是无状态的,不应接收或响应任何会话数据。这意味着不需要CSRF / XSRF令牌,我可以在您的示例中看到这些令牌。
您需要将API路由放置在指定的API路由文件中。您会注意到,授权中间件'auth:api'对于API路由也略有不同。
/routes/api.php
/**
* Register the routes needed for managing clients.
*
* @return void
*/
public function forClients()
{
$this->router->group(['middleware' => ['web', 'auth']], function ($router) {
$router->get('/clients', [
'uses' => 'ClientController@forUser',
'as' => 'passport.clients.index',
]);
...
});
}
然后在Postman中,只需传递您的不记名令牌和预期的响应类型。并且不要忘记在路由中添加“ api”前缀,就像对api.php路由文件中的所有路由一样。
/ api /您的路径/
Route::middleware(['auth:api'])->group(function () {
Route::get('/your/path', 'Api\YourController@index');
});
希望这会有所帮助,祝你好运!
答案 1 :(得分:0)
感谢您的回答@matticustard。我编写了一个小型控制器来测试授权,并使用auth:api中间件将路由放入以下组中:
resolve
当我使用不记名令牌和邮递员时,它可以正常工作,但我也想以未登录用户的身份在我的应用程序中使用此路由。但是,仅从我的应用程序而不是外部,我如何才能实现此目的?
Route::group(['prefix' => 'v1', 'middleware' => 'auth:api', 'namespace' => 'Api\v1', 'as' => 'api.'], function () {});
谢谢您的时间:)