我已经使用Laravel Passport文档成功创建了server.app和client.app.一切都按预期工作.
client.app路由:
Route::get('callback', function (Request $request) {
$http = new GuzzleHttp\Client;
$response = $http->post('http://server.app/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 3,
'client_secret' => 'secret',
'redirect_uri' => 'http://client.app/callback',
'code' => $request->code
]
]);
return json_decode((string) $response->getBody(), true)['access_token'];
});
Run Code Online (Sandbox Code Playgroud)
默认情况下,此路由返回access_token,我可以使用它来执行任何操作.
请求:
http://server.app/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fclient.app%2Fcallback&response_type=code&scope=
Run Code Online (Sandbox Code Playgroud)
返回:
http://client.app/callback?code=access_token
Run Code Online (Sandbox Code Playgroud)
题:
如何使用client.app中给定的access_token 向server.app发出正确的请求以获取用户的电子邮件(s).
我应该使用: http://server.app/api/user请求获取数据?如果是的话,我怎么能这样做?如果可能,请写一个代码.
谢谢你的回答.
更新了以下软件包后,出现了无法找到oauth-public.key文件的错误.
包装操作:1次安装,2次更新,0次删除
更新laravel/framework(v5.4.27 => v5.4.28):正在下载(100%)
安装defuse/php-encryption(v2.1.0):正在下载(100%)
正在更新league/oauth2-server(5.1.3 => 5.1) .4):下载(100%)
首先,我删除了项目/存储中的两个oauth文件,然后执行了这个命令:php artisan passport:install以生成新的oauth文件.
现在,在尝试访问api路由时出现以下错误.
(1/1)ErrorException chmod(/var/dev/project/storage/oauth-public.key):操作失败:不允许操作
堆栈跟踪
在CryptKey.php中(第51行)
at HandleExceptions-> handleError(2,'chmod(/var/dev/project/storage/oauth-public.key):操作失败:操作不被允许','/ var/dev/project/vendor/league/oauth2-server /src/CryptKey.php',51,array('keyPath'=>'file:///var/dev/project/storage/oauth-public.key','passPhrase'=> null,'keyPathPerms'=> '644'))
at chmod('file:///var/dev/project/storage/oauth-public.key',384)在CryptKey.php(第51行)
在ResourceServer.php中的CryptKey-> __construct('file:///var/dev/project/storage/oauth-public.key')(第50行)
文件权限
-rw-r--r-- user:user oauth-private.key
-rw-r--r-- user:user oauth-public.key
Run Code Online (Sandbox Code Playgroud)
更新1
我发现oauth Libaray引入了一个安全修复程序.Oauth V5安全改进
版本5.1.4是与其他5.1.x版本的向后兼容版本.
您将在服务器日志中注意到如下消息:
您必须设置加密密钥以提高此库的安全性 - 有关详细信息,请参阅此页面https://oauth2.thephpleague.com/v5-security-improvements/
要在实例化\ League\OAuth2\Server\AuthorizationServer实例后暂停此通知,您应该调用setEncryptionKey()方法传入至少32个字节的随机数据.
您可以使用base64_encode(random_bytes(32))生成它.或者,如果你使用的是Laravel这样的框架,它已经生成了加密密钥,你可以传入(在Laravel的情况下使用env('APP_KEY')).
问题是Laravel Passport的维护者必须解决这个问题.
更新2
删除供应商文件夹并再次执行composer安装后,我仍然遇到同样的错误.
当我使用auth:apiGuard 进行注销路由时,我遇到以下异常:
Auth Guard [:api] 未定义
我已经实现了注册/登录 API,但我在使用注销 API 时遇到了此错误,我已使用auth::api.
config/auth.php:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Run Code Online (Sandbox Code Playgroud)
routes/api.php:
Route::group(['prefix' => 'auth'], function () {
Route::post('login','AuthController@login');
Route::post('signup','AuthController@signup');
Route::group(['middleware' => 'auth::api'], function () {
Route::get('logout','AuthController@logout');
Route::get('user','AuthController@user');
});
});
Run Code Online (Sandbox Code Playgroud)
我应该能够注销用户。
我根据文档安装了Laravel Passport,并且修改了所需的代码的所有区域.
我正在设置密码授予令牌,以便用户在使用他们的站点用户名和密码登录时能够获得API令牌.当涉及到grant_type时,我遇到了一个问题.出于某种原因,Laravel抱怨无效的授权类型.
{
"error": "unsupported_grant_type",
"message": "The authorization grant type is not supported by the authorization server.",
"hint": "Check the `grant_type` parameter"
}
Run Code Online (Sandbox Code Playgroud)
这些是我要发布的字段 /oauth/token
client_id = 4
client_secret = SMiYE7XqDNtXKQnmkYmFnXxfAaV83vRhnJ9zwCtZ
username = jcrawford@domain.com
password = **************
grant_type = password
scope = *
Run Code Online (Sandbox Code Playgroud)
我跑了php artisan passport:install,我也跑了php artisan passport:client --password
这两个命令都有效,并且都创建了客户端和机密,但是,我似乎无法通过grant_type的错误.
关于我应该怎样看待解决的任何建议,以便密码授予令牌对我有用?
我目前正在开发一个API并且已经打了一堵砖墙.我正在使用带有"密码"授权类型的Passport.
我想用访问令牌返回用户信息,但是,我不知道如何.
我可以实现,编辑或扩展哪个类来获取它?
我想要退回:
{
"token_type": "Bearer",
"expires_in": 31536000,
"access_token": "lalalalalal",
"refresh_token": "lalalallala",
"user": {
"username": "a username",
"user_type": "admin"
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我设置了密码授权(它是应用程序的后端).现在,我可以发送一个帖子请求oauth/token,它适用于邮递员.但是,如果我也想从api注册用户怎么办?
我知道我可以使用当前/register路由,但是,我是否需要将用户重定向回登录页面并使用他的凭据再次登录?
或者在RegisterController中,在registered()函数中,我应该重定向到oauth/token路由吗?(为此,请注意我发送的所有5个数据都在'x-www-form-urlencoded'中,它似乎有效.但是,我是否需要在标题中分开一些?这对我来说很模糊,所以只是想要当我有机会时问.)
或者我应该oauth/token像这个人一样在方法中添加一些东西?实际上,我试图捕获库中方法的发布$request数据AccessTokenController@issueToken,但是我无法弄清楚如何操作parsedBody数组.如果我从实际库中触发我的寄存器功能,我怎么知道它是注册还是登录?
也许我错过了一些信息,但根据这个主题我找不到任何东西.在Passport中处理注册用户的正确方法是什么?
更新:接受的答案显示'注册'周期; 在它下面我添加了'login'和'refresh token'实现.希望能帮助到你 :)
我知道我不是唯一一个达到这一点的人.有谁知道如何在Laravel(5.3)护照中正确实施自定义补助金?
要么
有一个很好的链接/教程,以参考如何正确地做到这一点?
我知道有这个包裹:
https://github.com/mikemclin/passport-custom-request-grant
但我要求更多"自己动手"的做法.
先感谢您.
我正在使用Laravel 5.3和Passport.
当使用Postman测试我在api.php文件中设置的任何路由时,它总是返回登录页面.这是我测试路线的一个例子:
Route::get('/getKey', function() {
return 'hello';
})->middleware('client_credentials');
Run Code Online (Sandbox Code Playgroud)
邮差:
Accept application/json
Authorization Bearer <then my key>
Run Code Online (Sandbox Code Playgroud)
我在寻找答案的过程中找到了另一个解决方案,将中间件设置为'auth:api'.
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('auth:api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过几乎所有适用于其他人的解决方案,但仍然没有运气.任何建议将不胜感激.
更新所以我终于得到了一些工作.我创建了一个消费者应用程序并创建了一些测试功能.通过验证令牌,我能够使用api.但是,点击此路线不再返回我的登录页面,而是现在不返回任何内容.因此无论出于何种原因,它仍无法正常工
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('client_credentials');
Run Code Online (Sandbox Code Playgroud) 我正在创建一个路由/user/logout使用dusterio/lumen-passport和在控制器操作中我手动撤销令牌,导致用户被注销.
我有两个注销用户的选项.撤消令牌(将令牌保留在数据库中 - 只需设置一个标志,告知令牌无用)并删除令牌.
我的问题很简单:
管理令牌的最佳方法是什么?我应该通过删除或撤销来退出吗?
将来,我将使用redis存储令牌,所以我想我应该删除令牌,因为在redis服务器中保留过期数据是没有意义的.
我刚刚阅读了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":"password","client_id":1,//我从命令获得的客户端ID(问题1) "client_secret":"嘘"//我从命令得到的客户端秘密(问题1)}
当我使用前一个端点登录用户时,我得到了一个refresh_token,我读到我可以通过http://example.com/oauth/token/refresh刷新令牌,但我尝试请求刷新我得到错误419,我从csrf验证中删除了url oauth/token/refresh,现在我回来了"message": "Unauthenticated.",我正在提出以下请求:
Content-Type: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*是有办法从护照公布的端点删除它们?非常感谢你的帮助!
laravel-passport ×10
laravel ×7
php ×6
laravel-5.3 ×3
oauth ×3
laravel-5 ×2
oauth-2.0 ×2
access-token ×1
api ×1
json ×1
laravel-5.2 ×1
laravel-5.4 ×1
lumen ×1
permissions ×1
security ×1