php 在 laravel 护照客户端应用程序中使用访问令牌获取用户数据
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41746078/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get user data using access token in laravel passport client app
提问by Tauras
I have successfully created server.appand client.appusing Laravel Passport documentation. Everything works as expected.
我已经使用Laravel Passport 文档成功创建了server.app和client.app。一切都按预期工作。
client.app Route:
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'];
});
By default, this route returns access_token, with which i can do whatever i want.
默认情况下,这条路线返回access_token,我可以用它做任何我想做的事。
Request:
要求:
http://server.app/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fclient.app%2Fcallback&response_type=code&scope=
Returns:
返回:
http://client.app/callback?code=access_token
Question:
题:
How to make correct request to server.appwith given access_token in client.appto get for example user(s) email(s).
如何使用client.app 中给定的 access_token向server.app发出正确请求以获取例如用户电子邮件。
Should i use: http://server.app/api/user
request to get data? If yes, how i can do that? If possible, please write a code.
我应该使用:http://server.app/api/user
请求获取数据吗?如果是,我该怎么做?如果可能,请写一个代码。
Thanks for any answers.
感谢您提供任何答案。
回答by adamj
I've been going absolutely insane about this issue! It just made no freaking sense as to why it kept spitting out the stupid Unauthenticated
error when trying to hit-up a route such as /api/user
. After much searching (MUCH searching), I finally found the answer. If you see this fero from Laracasts, you're my hero!
对于这个问题,我已经快疯了!至于为什么它Unauthenticated
在尝试启动诸如/api/user
. 经过多次搜索(大量搜索),我终于找到了答案。如果你从 Laracasts 看到这个 fero,你就是我的英雄!
Did you check
app\Providers\RouteServiceProvider.php
?in the
mapApiRoutes()
you can set the middleware. check to make sure itsauth:api
. if its not, change it. also, remove theauth
middlewarefrom the routeapi.php
file.
你检查了
app\Providers\RouteServiceProvider.php
吗?在
mapApiRoutes()
你可以设置中间件。检查以确保其auth:api
. 如果不是,请更改它。另外,从路由文件中删除auth
中间件api.php
。
Edit:
编辑:
Once you've made the change to the app\Providers\RouteServiceProvider.php
mentioned above, proceed with the below example.
对app\Providers\RouteServiceProvider.php
上述内容进行更改后,请继续执行以下示例。
First things first, we need to retrieve a fresh access_token
. To do this, I'm using the passwordgrant_type
(more info: https://laravel.com/docs/5.4/passport#password-grant-tokens)
首先,我们需要检索一个新的access_token
. 为此,我使用密码grant_type
(更多信息:https: //laravel.com/docs/5.4/passport#password-grant-tokens)
To retrieve a fresh access_token
, I've created a new route on routes/web.php
and called it /connect
. I've then placed the code from the above link into it:
为了检索一个新的access_token
,我在上创建了一条新路线routes/web.php
并将其命名为/connect
。然后我将上面链接中的代码放入其中:
Route::get('connect', function (Request $request) {
$http = new GuzzleHttp\Client;
$response = $http->post('http://example.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => $request->client_id,
'client_secret' => $request->client_secret,
'username' => $request->username,
'password' => $request->password,
'scope' => ''
],
]);
return json_decode((string) $response->getBody(), true);
});
Using Chrome Postman, you need to:
使用Chrome Postman,您需要:
- Set the method to
GET
- Enter the connect URL with the relevant params i.e. http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
- Click the headerstab (it's next to Authorization), add a key of
Accept
and value ofapplication/json
- Hit the Send button
- 将方法设置为
GET
- 输入带有相关参数的连接 URL,即http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
- 单击标题选项卡(它在授权旁边),添加一个键
Accept
和值application/json
- 点击发送按钮
Example result:
结果示例:
{
"token_type": "Bearer",
"expires_in": 31535999,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImE0MmFiYjZkNTQ5M2ZjMGQxYzVmM2E3MDFlOTNjMTRlOTQxMTBmNWQ5NmI1ODI0NTBmMmEyM2MwMzQ5OTMwODdiZGUwYTI5ZDU5N2VjYTExIn0.eyJhdWQiOiIxIiwianRpIjoiYTQyYWJiNmQ1NDkzZmMwZDFjNWYzYTcwMWU5M2MxNGU5NDExMGY1ZDk2YjU4MjQ1MGYyYTIzYzAzNDk5MzA4N2JkZTBhMjlkNTk3ZWNhMTEiLCJpYXQiOjE0OTE0Njg4ODIsIm5iZiI6MTQ5MTQ2ODg4MiwiZXhwIjoxNTIzMDA0ODgxLCJzdWIiOiI3NWNlZDUwMC0xNTQ0LTExZTctOWE4ZS1hZDVmMWFlZTM4OWUiLCJzY29wZXMiOltdfQ.dV3DKDM7IN-oGnZ_Rw10VnYkh9ySlz5i859yO0roZLAYwgmsmEEZK_vpttudUoKmYenqibZQXg6HG4KHRd-cgas_2DpO-7UCkXQYNTriUUAQ4XM6To86EOaf2BW1a07kdVGXTdo_ETQc7heUG0NWQ8-Hrr2NHkSyDULupDs8gDg_fg6xSVsFUEDZB32UIGwquAHT1Y21ZpTdQar0Rag9qOLeZYTR05ro0v9_rQbSoDgJiZE3KT9GbqwU_BegWRmAwY6LmxG4raZpSMgqYEMo3D9D0lJiomOLK4pSjqmi0EVti04zZ6Vg4GHE6S1TgC6IlakV2bMItXTWuZT6T0jEba-3ctaC4K2T8F4P8J6t-99mKY-_zSwgfGm1FErK09qixJlZ4zFsCCT7MgNQVoyu7GkJdTJVlpL1QXLc1QhfrtW11a4gg4Nlja_VyRdB9fZHomgMLpvm_HvSlqEvpeWb8wGkCts9w7ivSNLim-LuFgswGNhTZZqLEbuwB6sJV-l1V0MJCq7_h0yTmLlBdoUkxCaDJJvkUSLk0MUaalAAzY1OCxm-tJcKn31m4yOwf25ZDWf8tWuOTKarEbFyxjB0elkxXQXGe7J7TJAg0tuIEQ8YTL3ExJQ6I7zwtCL83bPOWYRGlJrsX6Lsf0qB-xMVD2DzA3JKDKvZTp5x92kP821",
"refresh_token": "ArOWW0glHjflLpL4fKOsrNUXT5v91u+CjwcE8LBvH7GJsaM0gWaFe8GH9zXjh8SHew+cg7v1IMiIPLYSVdf7h8oOeV7wgwjChI9YM0Kt6iE4wOXJuy0VwPSCj+danHDuWC3nJWYLrPydTE3h/jgFNjWEPfgXGLfiRWjWQMozddz5EWd4pvUI7J64Lw6cMCg/BslZLHtfN7IWoC1RQGp5K0cGO0QmZfsGMSzsoSUNFjv16BXiKSqlNvs5aGhxErFY4wEOKqBifXUkb3SwnK/iHKg3irmqj4fOf/aKNyCdd/PJCHrRPocrW83oM1sjq7eDufEIlgxmy7uRset8GLAWjx/n6rzkxz2QM0/9Lyc/XN9OL00XBYjA47a1wL55qUUUYWevaFwxWX8LG2UjBf9Vv2lfvLcBBkbgqpalePMDh6wb8IDyJek4BbvZtJ1VZ/l+A9XXY9rQt/hIDdoOAtib8CGr9/CERFIrByZa3TEJBCLAa2FvJSIhHVnKvnuvZX3e9qhTkgHqowJrWg2C3VyPDQYAdIhdpTEvs0pcGSAZWhwXfu9xKQOeyRTEScbLKQmuW+sGbwU+qfdLgh/BR5kW4TMer4TIzWKSuHsqmibgiUwaQkwTrtjH2Xz9Z9XmAbVzJ8pqbEZPe7t5whXDoRSnAwWymdxk2E7SiSsVUA3kX39="
}
Highlight the access_token
string and copy it to a text editor.
突出显示该access_token
字符串并将其复制到文本编辑器。
You'll then need to create a new route in routes/api.php
. The route below will simply output the current API users' info:
然后,您需要在routes/api.php
. 下面的路由将简单地输出当前 API 用户的信息:
Route::group(['prefix' => 'user'], function() {
Route::get('/', function() {
return response()->json(request()->user());
});
});
Once you've done the above, make these changes to Postman:
完成上述操作后,对 Postman 进行以下更改:
- Set the method to
GET
- Change the URL to point to the API route i.e. http://example.com/api/user
- Click on the headerstab again and add a new key of
Authorization
and value ofBearer access_token_here
(replaceaccess_token_here
with the access token you copied earlier) - Hit the Send button
- 将方法设置为
GET
- 更改 URL 以指向 API 路由,即http://example.com/api/user
- 再次单击标题选项卡并添加新的键
Authorization
和值Bearer access_token_here
(替换access_token_here
为您之前复制的访问令牌) - 点击发送按钮
Example output:
示例输出:
{
"id": "75ced500-1544-11e7-9a8e-ad5f1aee389e",
"name": "test test",
"email": "[email protected]",
"created_at": "2017-03-30 23:29:03",
"updated_at": "2017-03-30 23:29:03"
}
回答by Vandolph Reyes
Have you tried running it on POSTMAN chrome app? If not, download it. https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en
您是否尝试过在 POSTMAN chrome 应用程序上运行它?如果没有,请下载它。https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en
After you successfully generated the data, click the CODE button from the top-right (I highlighted it with green).
成功生成数据后,单击右上角的 CODE 按钮(我用绿色突出显示了它)。
Lastly, select your language and copy the code. For PHP, I selected php cURL.
最后,选择您的语言并复制代码。对于 PHP,我选择了 php cURL。
Hope it works.
希望它有效。
回答by shukshin.ivan
According to Laravel documentation, you should add route to server app (routes/api.php
): $response->getBody();
根据 Laravel文档,您应该将路由添加到服务器应用程序 ( routes/api.php
):$response->getBody();
Route::get('/user', function () {
// authenticated user. Use User::find() to get the user from db by id
return app()->request()->user();
})->middleware('auth:api');
Make request via quzzle:
通过 quzzle 提出请求:
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
echo $response->getBody();