gpt4 book ai didi

php - Laravel 的 5.3 passport 和 api 路由

转载 作者:IT王子 更新时间:2023-10-29 00:21:26 25 4
gpt4 key购买 nike

我正在使用 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、命名个人资料图片,然后从中获取点后用户被视为已注册。但是用户将 NOT 使用 facebook 登录(这是一个非常重要的方面)。消费者应用程序将获得一个 token 并使用该 token 访问 api 的各种端点(需要 token 才能使用)。

归根结底就是这样。我需要向访问 API 的消费者应用程序颁发访问 token 。 API 本身只有一个客户端,即移动应用程序本身。使用该应用的用户不被视为 API 的客户,而是移动应用本身的客户。

到目前为止,在实现 API 相关的东西时,Passport 令人头疼,或者我无法弄清楚如何让它正常工作。

我在 oauth_clients 表中创建了一个测试客户端,如下所示:

enter image description here

我正在使用 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.3 passport 的问题在于,与之前由 lucadegasperi 提供的用于 Laravel 库的 OAuth 2.0 服务器不同,它没有直接创建客户端的 API。所以好像现在只能通过前端来做客户端了。仅供引用,我们只想将 laravel passport 用于我们的移动应用程序,因此在创建和注册用户时,我们将只有 EMAIL 和密码,在某些情况下,只有 Facebook 用户 ID 用于 facebook 登录。因此,以下方法对我们的案例非常有效,可能会因您的情况而有所不同,但从长远来看可能会帮助您使用 laravel passport。

注意:在执行以下操作之前,假设您已在您的应用程序中启用密码授予。

所以我们在laravel 5.3上的项目解决方法如下:

  1. 在 oauth_clients 中将 id 字段转换为普通字段,即将其作为主键删除并将数据类型设为 varchar,这样我们就可以将电子邮件地址存储为 client_ids,因为它们对于您的系统也是唯一的。在 Facebook 登录的情况下,我们在此列中存储 Facebook 用户 ID,这对于我们的每个客户来说都是唯一的。同样对于其他表,例如:oauth_access_tokens、oauth_auth_codes 和 oauth_personal_access_clients,将 client_id 更改为 VARCHAR(255),以便它可以存储电子邮件地址或 Facebook 用户 ID。

  2. 现在转到您的模型并为 oauth_clients 表创建一个模型,以便您可以在创建用户时通过代码以编程方式创建客户端。

    <?php
    namespace App;


    use Illuminate\Database\Eloquent\Model;

    class OauthClient extends Model
    {
    protected $table = 'oauth_clients';
    }
  3. 然后在您的 api.php 路由文件中添加以下路由:

    Route::post('/register-user', function (Request $request) {

    $name = $request->input('name');
    $email = $request->input('email'),
    $password = $request->input('password'),

    // save new user
    $user = \App\User::create([
    'name' => $name,
    'email' => $email,
    'password' => bcrypt($password),
    ]);


    // create oauth client
    $oauth_client = \App\OauthClient::create([
    'user_id' => $user->id,
    'id' => $email,
    'name' => $name,
    'secret' => base64_encode(hash_hmac('sha256',$password, 'secret', true)),
    'password_client' => 1,
    'personal_access_client' => 0,
    'redirect' => '',
    'revoked' => 0,
    ]);


    return [
    'message' => 'user successfully created.'
    ];
    });

在上面的代码片段中,您必须注意,要生成 oauth_client secret ,您必须使用一些您觉得可以在您的应用程序中使用的强大加密公式。此外,使用相同的技术在您的移动应用程序上为相应的客户/用户生成 key 。

  1. 现在您可以使用 laravel passport 提供的标准 POST API,使用“oauth/token”使用以下参数通过密码授予请求访问 token :

    grant_type : 'password'
    client_id : '<email with which the user is registered>'
    client_secret : '<generate the client secret from the mobile app>'
    username : '<email with which the user is registered>'
    password : '<password entered by the user>'
    scope : '<leave empty as default>'
  2. 上面会给你一个响应,如果一切正确,类似于:

    {
    "token_type": "Bearer",
    "expires_in": 3155673600,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjMwZmM0MDk1NWY5YjUwNDViOTUzNDlmZjc2M2ExNDUxOTAxZjc5YTA5YjE4OWM1MjEzOTJlZmNiMDgwOWQzMzQwM2ExZWI4ZmMyODQ1MTE3In0.eyJhdWQiOiJzaHVqYWhtQGdtYWlsLmNvbSIsImp0aSI6IjMwZmM0MDk1NWY5YjUwNDViOTUzNDlmZjc2M2ExNDUxOTAxZjc5YTA5YjE4OWM1MjEzOTJlZmNiMDgwOWQzMzQwM2ExZWI4ZmMyODQ1MTE3IiwiaWF0IjoxNDc4MTQ1NjMyLCJuYmYiOjE0NzgxNDU2MzIsImV4cCI6NDYzMzgxOTIzMiwic3ViIjoiMSIsInNjb3BlcyI6W119.dj3g9b2AdPCK-im5uab-01SP71S7AR96R0FQTKKoaZV7M5ID1pSXDlmZw96o5Bd_Xsy0nUqFsPNRQsLvYaOuHZsP8v9mOVirBXLIBvPcBc6lDRdNXvRidNqeh4JHhJu9a5VzNlJPm3joBYSco4wYzNHs2BPSxXuuD3o63nKRHhuUHB-HwjVxj2GDwzEYXdZmf2ZXOGRJ99DlWGDvWx8xQgMQtd1E9Xk_Rs6Iu8tycjBpKBaC24AKxMI6T8DpelnFmUbMcz-pRsgCWCF_hxv6FpXav3jr1CLhhT58_udBvXjQAXEbtHeB7W_oaMcaqezHdAeOWDcnqREZHsnXHtKt0JpymcTWBkS2cg7sJzy6P9mOGgQ8B4gb8wt44_kHTeWnokk4yPFRZojkHLVZb8YL6hZxLlzgV1jCHUxXoHNe1VKlHArdlV8LAts9pqARZkyBRfwQ8oiTL-2m16FQ_qGg-9vI0Suv7d6_W126afI3LxqDBi8AyqpQzZX1FWmuJLV0QiNM0nzTyokzz7w1ilJP2PxIeUzMRlVaJyA395zq2HjbFEenCkd7bAmTGrgEkyWM6XEq1P7qIC_Ne_pLNAV6DLXUpg9bUWEHhHPXIDYKHS-c3N9fPDt8UVvGI8n0rPMieTN92NsYZ_6OqLNpcm6TrhMNZ9eg5EC0IPySrrv62jE",
    "refresh_token": "BbwRuDnVfm7tRQk7qSYByFbQKK+shYPDinYA9+q5c/ovIE1xETyWitvq6PU8AHnI5FWb06Nl2BVoBwCHCUmFaeRXQQgYY/i5vIDEQ/TJYFLVPRHDc7CKILF0kMakWKDk7wJdl5J6k5mN38th4pAAZOubiRoZ+2npLC7OSZd5Mq8LCBayzqtyy/QA5MY9ywCgb1PErzrGQhzB3mNhKj7U51ZnYT3nS5nCH7iJkCjaKvd/Hwsx2M6pXnpY45xlDVeTOjZxxaOF/e0+VT2FP2+TZMDRfrSMLBEkpbyX0M/VxunriRJPXTUvl3PW0sVOEa3J7+fbce0XWAKz7PNs3+hcdzD2Av2VHYF7/bJwcDCO77ky0G4JlHjqC0HnnGP2UWI5qR+tCSBga7+M1P3ESjcTCV6G6H+7f8SOSv9FECcJ8J5WUrU+EHrZ95bDtPc9scE4P3OEQaYchlC9GHk2ZoGo5oMJI6YACuRfbGQJNBjdjxvLIrAMrB6DNGDMbH6UZodkpZgQjGVuoCWgFEfLqegHbp34CjwL5ZFJGohV+E87KxedXE6aEseywyjmGLGZwAekjsjNwuxqD2QMb05sg9VkiUPMsvn45K9iCLS5clEKOTwkd+JuWw2IU80pA24aXN64RvOJX5VKMN6CPluJVLdjHeFL55SB7nlDjp15WhoMU1A="
    }

这只是一个临时解决方案,直到 laravel 支持应用程序的外部 API,该应用程序只有移动设备作为创建 oAuth 客户端和用户的唯一可能界面。

希望对你有帮助!干杯。

关于php - Laravel 的 5.3 passport 和 api 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39525968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com