Laravel 5.3 和护照。尝试为 API 创建单个客户端
Laravel 5.3 and Passport. Trying to create a single client for an API
我正在尝试创建一个 API 来为移动应用程序提供服务。我正在使用 Laravel 5.3 和 Passport。
流程本身是这样的。移动应用程序将提供 API 一个 facebook 访问令牌,用于获取有关用户的一些信息(facebook id、姓名、个人资料图片和电子邮件)。届时后端将插入(如果尚不存在)上述信息到用户 table,基本上是创建一个新用户。请注意,后端无论如何都无法登录 facebook,因为移动应用程序已经授予了访问令牌。
之后需要做的是后端将向移动应用程序提供访问令牌,该令牌将用于从 API 本身访问其他路由。这应该通过 Passport 完成。据我所知,通过 Passport 需要为每个用户创建一个新客户端,但我不是在寻找它,因为移动应用程序是 API 将拥有的唯一 "client"。通过 facebook 创建的用户实际上是移动应用程序的用户,而不是 API 本身。 oauth_clients
的架构是:
CREATE TABLE `oauth_clients` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`secret` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`redirect` text COLLATE utf8_unicode_ci NOT NULL,
`personal_access_client` tinyint(1) NOT NULL,
`password_client` tinyint(1) NOT NULL,
`revoked` tinyint(1) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `oauth_clients_user_id_index` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
我没有以任何方式修改它,这是默认架构。
这对我的需求没有意义,我不想要一堆客户,我只想要一个客户。移动应用本身。
我当然可以只为移动应用程序本身创建一个用户,Facebook 用户将始终在 oauth_clients
table 中分配移动应用程序 user_id
,但这只是好像不对。
客户端和用户不一样!在这种情况下,客户端是具有多个用户的 Mobile_Application?所以你只需要 1 个客户端就可以工作。如果对您的需求有帮助,请试试这个?
在 laravel doc's here
中安装默认值 Auth-Scaffolding
安装通行证doc's here
通过auth-scaffolding
注册用户
转到 RESTED 或 POSTMAN,或任何其他类似服务
在 oauth_clients table 中检查您的 form_params
中的数据
通过 Request_body_form_data 而不是 headers RESTED 写你的 forms_params 并发送 POST 请求到 */oauth/token(需要完整的 url)
(需要form_params分别是grant_type、client_id、client_secret、用户名和密码)
你应该进入 return 一个带有 4 个键的 object
(token_type, expires_in, access_token & refresh_token) 和状态 200 OK.
如果到目前为止一切顺利...
打开另一个 RESTED window:
向 /api/user 发送 GET 请求(再次需要完整 url)在 headers 中写入 2 name-value 对(接受 => application/json,授权=> 持有人 ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST(到 /oauth/token)
应该就是这样。您应该得到一个用户 object 作为来自 /api/user 的响应。
Laravel 5.3 passport 的问题在于,与以前由 lucadegasperi 提供的 Laravel 库的 OAuth 2.0 服务器不同,它没有 API 直接创建客户端。所以好像现在只能通过前端来做客户端了。仅供参考,我们只想为我们的移动应用程序使用 laravel 护照,因此在创建和注册用户时,我们只有 EMAIL 和密码,在某些情况下只有 Facebook 用户 ID。
在 oauth_clients 中将 id 字段转换为普通字段,即删除它作为主键并将数据类型设为 varchar,以便我们可以将电子邮件地址存储为 client_ids 因为它们对于您的系统也是独一无二的。在 Facebook 登录的情况下,我们在此列中存储 Facebook 用户 ID,这对于我们的每个客户来说都是唯一的。同样对于其他 tables,如:oauth_access_tokens、oauth_auth_codes 和 oauth_personal_access_clients 将 client_id 更改为 VARCHAR(255),以便它可以存储电子邮件地址或 Facebook 用户 ID .
现在转到您的模型并为 oauth_clients table 创建一个模型,这样您就可以在创建用户的同时从代码中实用地创建客户端。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class oAuthClient extends Model
{
protected $table = 'oauth_clients';
}
然后你在你的 api.php 路由文件中添加以下路由:
Route::post('/register-user', function () {
$email= \Illuminate\Support\Facades\Input::get('email');
$password=\Illuminate\Support\Facades\Input::get('password');
$user = new \App\User(array(
'name' =>\Illuminate\Support\Facades\Input::get('name'),
'email' => \Illuminate\Support\Facades\Input::get('email'),
'password' => bcrypt(\Illuminate\Support\Facades\Input::get('password')),
));
$user->save();
$oauth_client=new \App\oAuthClient();
$oauth_client->user_id=$user->id;
$oauth_client->id=$email;
$oauth_client->name=$user->name;
$oauth_client->secret=base64_encode(hash_hmac('sha256',$password, 'secret', true));
$oauth_client->password_client=1;
$oauth_client->personal_access_client=0;
$oauth_client->redirect='';
$oauth_client->revoked=0;
$oauth_client->save();
return [
'message' => 'user successfully created.'
];
});
在上面的代码片段中,您必须注意,要生成 oauth_client 秘密,您必须使用一些您认为适合 table 在您的应用程序中使用的强大加密公式。还可以使用相同的技术在您的移动应用程序上为相应的 client/user.
生成密钥
现在您可以使用 laravel 护照提供的标准 POST API 通过使用 "oauth/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>'
上面会给你一个回复,如果一切正确,类似于:
{
"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="
}
希望对您有所帮助!
干杯。
我正在尝试创建一个 API 来为移动应用程序提供服务。我正在使用 Laravel 5.3 和 Passport。
流程本身是这样的。移动应用程序将提供 API 一个 facebook 访问令牌,用于获取有关用户的一些信息(facebook id、姓名、个人资料图片和电子邮件)。届时后端将插入(如果尚不存在)上述信息到用户 table,基本上是创建一个新用户。请注意,后端无论如何都无法登录 facebook,因为移动应用程序已经授予了访问令牌。
之后需要做的是后端将向移动应用程序提供访问令牌,该令牌将用于从 API 本身访问其他路由。这应该通过 Passport 完成。据我所知,通过 Passport 需要为每个用户创建一个新客户端,但我不是在寻找它,因为移动应用程序是 API 将拥有的唯一 "client"。通过 facebook 创建的用户实际上是移动应用程序的用户,而不是 API 本身。 oauth_clients
的架构是:
CREATE TABLE `oauth_clients` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`secret` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`redirect` text COLLATE utf8_unicode_ci NOT NULL,
`personal_access_client` tinyint(1) NOT NULL,
`password_client` tinyint(1) NOT NULL,
`revoked` tinyint(1) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `oauth_clients_user_id_index` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
我没有以任何方式修改它,这是默认架构。
这对我的需求没有意义,我不想要一堆客户,我只想要一个客户。移动应用本身。
我当然可以只为移动应用程序本身创建一个用户,Facebook 用户将始终在 oauth_clients
table 中分配移动应用程序 user_id
,但这只是好像不对。
客户端和用户不一样!在这种情况下,客户端是具有多个用户的 Mobile_Application?所以你只需要 1 个客户端就可以工作。如果对您的需求有帮助,请试试这个?
在 laravel doc's here
中安装默认值 Auth-Scaffolding
安装通行证doc's here
通过auth-scaffolding
注册用户
转到 RESTED 或 POSTMAN,或任何其他类似服务
在 oauth_clients table 中检查您的 form_params
中的数据
通过 Request_body_form_data 而不是 headers RESTED 写你的 forms_params 并发送 POST 请求到 */oauth/token(需要完整的 url)
(需要form_params分别是grant_type、client_id、client_secret、用户名和密码)
你应该进入 return 一个带有 4 个键的 object
(token_type, expires_in, access_token & refresh_token) 和状态 200 OK.
如果到目前为止一切顺利...
打开另一个 RESTED window:
向 /api/user 发送 GET 请求(再次需要完整 url)在 headers 中写入 2 name-value 对(接受 => application/json,授权=> 持有人 ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST(到 /oauth/token)
应该就是这样。您应该得到一个用户 object 作为来自 /api/user 的响应。
Laravel 5.3 passport 的问题在于,与以前由 lucadegasperi 提供的 Laravel 库的 OAuth 2.0 服务器不同,它没有 API 直接创建客户端。所以好像现在只能通过前端来做客户端了。仅供参考,我们只想为我们的移动应用程序使用 laravel 护照,因此在创建和注册用户时,我们只有 EMAIL 和密码,在某些情况下只有 Facebook 用户 ID。
在 oauth_clients 中将 id 字段转换为普通字段,即删除它作为主键并将数据类型设为 varchar,以便我们可以将电子邮件地址存储为 client_ids 因为它们对于您的系统也是独一无二的。在 Facebook 登录的情况下,我们在此列中存储 Facebook 用户 ID,这对于我们的每个客户来说都是唯一的。同样对于其他 tables,如:oauth_access_tokens、oauth_auth_codes 和 oauth_personal_access_clients 将 client_id 更改为 VARCHAR(255),以便它可以存储电子邮件地址或 Facebook 用户 ID .
现在转到您的模型并为 oauth_clients table 创建一个模型,这样您就可以在创建用户的同时从代码中实用地创建客户端。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class oAuthClient extends Model { protected $table = 'oauth_clients'; }
然后你在你的 api.php 路由文件中添加以下路由:
Route::post('/register-user', function () { $email= \Illuminate\Support\Facades\Input::get('email'); $password=\Illuminate\Support\Facades\Input::get('password'); $user = new \App\User(array( 'name' =>\Illuminate\Support\Facades\Input::get('name'), 'email' => \Illuminate\Support\Facades\Input::get('email'), 'password' => bcrypt(\Illuminate\Support\Facades\Input::get('password')), )); $user->save(); $oauth_client=new \App\oAuthClient(); $oauth_client->user_id=$user->id; $oauth_client->id=$email; $oauth_client->name=$user->name; $oauth_client->secret=base64_encode(hash_hmac('sha256',$password, 'secret', true)); $oauth_client->password_client=1; $oauth_client->personal_access_client=0; $oauth_client->redirect=''; $oauth_client->revoked=0; $oauth_client->save(); return [ 'message' => 'user successfully created.' ]; });
在上面的代码片段中,您必须注意,要生成 oauth_client 秘密,您必须使用一些您认为适合 table 在您的应用程序中使用的强大加密公式。还可以使用相同的技术在您的移动应用程序上为相应的 client/user.
生成密钥现在您可以使用 laravel 护照提供的标准 POST API 通过使用 "oauth/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>'
上面会给你一个回复,如果一切正确,类似于:
{ "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=" }
希望对您有所帮助! 干杯。