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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 02:27:44  来源:igfitidea点击:

Get user data using access token in laravel passport client app

phpjsonlaravelaccess-tokenlaravel-passport

提问by Tauras

I have successfully created server.appand client.appusing Laravel Passport documentation. Everything works as expected.

我已经使用Laravel Passport 文档成功创建了server.appclient.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/userrequest 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 Unauthenticatederror 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 its auth:api. if its not, change it. also, remove the authmiddlewarefrom the route api.phpfile.

你检查了app\Providers\RouteServiceProvider.php吗?

mapApiRoutes()你可以设置中间件。检查以确保其auth:api. 如果不是,请更改它。另外,从路由文件中删除auth中间件api.php

https://laracasts.com/discuss/channels/laravel/laravel-53-passport-api-unauthenticated-in-postman-using-personal-access-tokens

https://laracasts.com/discuss/channels/laravel/laravel-53-passport-api-unauthenticated-in-postman-using-personal-access-tokens

Edit:

编辑:

Once you've made the change to the app\Providers\RouteServiceProvider.phpmentioned 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.phpand 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,您需要:

  1. Set the method to GET
  2. Enter the connect URL with the relevant params i.e. http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
  3. Click the headerstab (it's next to Authorization), add a key of Acceptand value of application/json
  4. Hit the Send button
  1. 将方法设置为 GET
  2. 输入带有相关参数的连接 URL,即http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
  3. 单击标题选项卡(它在授权旁边),添加一个键Accept和值application/json
  4. 点击发送按钮

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_tokenstring 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 进行以下更改:

  1. Set the method to GET
  2. Change the URL to point to the API route i.e. http://example.com/api/user
  3. Click on the headerstab again and add a new key of Authorizationand value of Bearer access_token_here(replace access_token_herewith the access token you copied earlier)
  4. Hit the Send button
  1. 将方法设置为 GET
  2. 更改 URL 以指向 API 路由,即http://example.com/api/user
  3. 再次单击标题选项卡并添加新的键Authorization和值Bearer access_token_here(替换access_token_here为您之前复制的访问令牌)
  4. 点击发送按钮

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

Fill the information. enter image description here

填写信息。 在此处输入图片说明

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();