【发布时间】:2017-01-24 08:34:05
【问题描述】:
我使用的是 Laravel Framework 5.3.9 版,通过 composer 全新下载并没有添加任何内容("laravel/passport": "^1.0" 除外)。
我做了docs 中建议的所有事情。表已创建,路线已启动,一切正常。但是我需要 API 护照。
我的路线如下所示:
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/v1/users/register | api::users::register | App\Http\Controllers\Api\V1\SocialController@register | api,auth |
| | POST | oauth/authorize | | \Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve | web,auth |
| | GET|HEAD | oauth/authorize | | \Laravel\Passport\Http\Controllers\AuthorizationController@authorize | web,auth |
| | DELETE | oauth/authorize | | \Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny | web,auth |
| | GET|HEAD | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@forUser | web,auth |
| | POST | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@store | web,auth |
| | PUT | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@update | web,auth |
| | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth |
| | GET|HEAD | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser | web,auth |
| | POST | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store | web,auth |
| | DELETE | oauth/personal-access-tokens/{token_id} | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy | web,auth |
| | GET|HEAD | oauth/scopes | | \Laravel\Passport\Http\Controllers\ScopeController@all | web,auth |
| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | |
| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
| | GET|HEAD | oauth/tokens | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth |
| | DELETE | oauth/tokens/{token_id} | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth |
+--------+----------+-----------------------------------------+----------------------+----------------------------------------------------------------------------+------------+
所有的web 路由都在那里,没有api 相关的路由,因为 Passport 不提供开箱即用的任何东西。
API 本身旨在供受信任的客户端使用,它是为需要登录的移动应用程序而设计的,但是,所述登录将绕过几个步骤。
一旦用户访问/register 路由,注册过程本身就非常简单:访问用户的 facebook 帐户并获取一些字段 - 电子邮件、facebook id、命名个人资料图片,然后从那时起考虑用户挂号的。但是用户将不使用 facebook 登录(这是一个非常重要的方面)。消费者应用程序将获得一个令牌并使用该令牌访问 api 的各种端点(需要使用令牌)。
所以归结为这一点。我需要向访问 API 的消费者应用程序颁发访问令牌。 API 本身只有一个客户端,即移动应用程序本身。使用该应用的用户不被视为 API 的客户端,而是移动应用本身的客户端。
到目前为止,在实现 API 相关的东西时,使用 Passport 是一件令人头疼的事情,或者我不知道如何让它正常工作。
我在oauth_clients 表中创建了一个测试客户端,如下所示:
我正在使用 Postman 访问具有 auth 中间件的 api/v1/users/register 路由和以下 JSON application/json
{
"grant_type" : "authorization_code",
"client_id" : 5,
"client_secet": "y5dvPIOxQJOjYn7w2zzg4c6TRrphsrNFWbG4gAUL"
}
这当然会导致
{"error":"Unauthenticated."}
这很有意义。
出于纯粹的好奇,我将/register 路由更改为:
Route::group([
'middleware' => [
],
], function ()
{
Route::group([
'prefix' => 'users',
'as' => 'users::',
], function ()
{
// Route::get('/register', ['as' => 'register', 'uses' => 'Api\V1\SocialController@register',]);
Route::post('/register', ['as' => 'register', 'uses' => '\Laravel\Passport\Http\Controllers\AccessTokenController@issueToken',]);
});
});
使用与以前相同的json。这导致了{"error":"invalid_client","message":"Client authentication failed"}。
我已经找到了处理 vendor/leagueoauth2-server/src/Grant/AbstractGrant` 中的 validateClient 部分的函数。
$client 为空。现在这可能与 Passport 相关,也可能不相关,因为它的文档相当缺乏,并且想通过一个巨大的包裹来追踪错误,这可能主要是由于我没有做正确的事情并没有打动我作为一个好主意,我别无选择。老实说,我什至不知道问题出在哪里。
真的,在这一点上,任何指向正确方向的排序都非常受欢迎。
问题部分是
【问题讨论】:
-
我没有。我刚决定使用 Laravel 5.2。谢天谢地,这个项目还处于起步阶段,它让我能够做到这一点。
-
您是否希望在同一应用程序的前端或 API 所属的前端应用程序以外的前端应用程序上利用 API?
-
@Andrew 我也还没有解决。我在我的 Windows 开发服务器上运行,我希望搬到我的 linux 机器上可能会神奇地修复它!
-
@tptcat 我自己我正在尝试将它用于使用 ElectronJS 的外部桌面应用程序以及相同的本地应用程序
-
@tptcat 消费者将成为移动应用程序。
标签: php laravel-5.3