我刚刚阅读了https://laravel.com/docs/5.6/passport文档,我有些疑惑希望有人可以帮助我:
首先,在某些情况下,我想使用Passport作为为我的移动应用程序(第一方应用程序)提供Oauth身份验证的方法。
当我使用php artisan passport:client --password
时,我会收到客户端ID和客户端密钥。这个值是否必须在我的应用上修复?例如,将它们存储为硬编码或“设置”文件?如果不应存储这些值,那么它应该如何工作?
要将用户注册到我的应用,我使用:$user->createToken('The-App')->accessToken;
我得到的是accessToken将用于发送我的所有请求作为标题(Authorization => Bearer $ accessToken)但是究竟什么是“The-App”值?
要登录我正在使用网址的用户:http://example.com/oauth/token并作为参数发送:
{ “username”:“user@email.com”, “password”:“userpassword”, “grant_type”:“密码”, “client_id”:1,//我从命令中获得的客户端ID(问题1) “client_secret”:“嘘”//我从命令中得到的客户端秘密(问题1) }
当我使用前一个端点登录用户时,我回到了refresh_token,我读到我可以通过http://example.com/oauth/token/refresh刷新令牌,但我尝试请求刷新我得到了错误419,我删除了来自csrf验证的url oauth / token / refresh现在我回来"message": "Unauthenticated."
,我正在提出以下请求:
内容类型:x-www-form-urlencoded grant_type:refresh_token refresh_token:-refresh-token //我从命令中获取的刷新令牌(问题3) client_id:1 //我从命令获得的客户端ID(问题1) client_secret:嘘//我从命令得到的客户端秘密(问题1) 范围:''
我应该使用此端点吗?鉴于我正在努力开发的应用程序,或者没有必要。
oauth/clients*
,oauth/personal-access-tokens*
有没有办法将它们从已发布的端点中删除通过护照?非常感谢你的帮助!
答案 0 :(得分:23)
如果您正在使用自己的api,那么您就不需要致电http://example.com/oauth/token 用户登录,因为那时你需要在app端存储client_id和client_secret。最好为登录创建一个api,在那里你可以检查凭据并生成个人令牌。
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
// Authentication passed...
$user = Auth::user();
$token = $user->createToken('Token Name')->accessToken;
return response()->json($token);
}
}
最后,我从护照中得到了许多终点 不要以为我会用例如:oauth / clients *, oauth / personal-access-tokens *有没有办法将它们从中删除 护照公布的终点?
您需要从AuthServiceProvider中删除Passport::routes();
并手动只放置所需的护照路由。我认为你只需要oauth/token
路线。
究竟是什么" The-App"价值为?
如果您检查 oauth_access_tokens 表,则会显示名称字段。 $user->createToken('Token Name')->accessToken;
此处"令牌名称" 存储在名称字段中。
如何使用带有密码授予令牌的Laravel Passport?
要生成密码授予令牌,您必须在应用端存储client_id
和client_secret
(不推荐,请检查this)并假设您是否必须重置client_secret
然后旧版本的应用程序停止工作,这些是问题。要生成密码授予令牌,您必须像在步骤3中提到的那样调用此API。
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
从
生成令牌refresh_token
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'refresh_token',
'refresh_token' => 'the-refresh-token',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
您也可以查看此https://laravel.com/docs/5.6/passport#implicit-grant-tokens。
答案 1 :(得分:0)
解决问题5
最后,我从护照中获得了很多端点,例如,我认为我不会使用它们:
oauth/clients*
,oauth/personal-access-tokens*
可以将它们从发布的端点中删除通过护照吗?
Passport::routes($callback = null, array $options = [])
具有可选的$callback
函数和可选的$options
参数。
回调函数带有一个$router
参数,然后您可以从中选择要安装的路由,如下所示,在AuthServiceProvider.php
中启用了更精细的配置:
Passport::routes(function ($router) {
$router->forAccessTokens();
$router->forPersonalAccessTokens();
$router->forTransientTokens();
});
Passport::tokensExpireIn(Carbon::now()->addMinutes(10));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(10));
这样,我们仅创建所需的护照路线。
forAccessTokens()
;使我们能够创建访问令牌。
forPersonalAccessTokens()
;使我们能够创建个人令牌,尽管我们将不在本文中使用它。最后,
forTransientTokens()
;创建用于刷新令牌的路由。
如果运行php artisan route:list
,则可以看到Laravel Passport安装的新端点。
| POST | oauth/token | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken
| POST | oauth/token/refresh | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh