在laravel passport客户端应用程序中使用访问令牌获取用户数据

时间:2017-01-19 15:49:05

标签: php json laravel access-token laravel-passport

我已使用 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'];
});

默认情况下,此路线返回 access_token ,我可以随意使用。

请求:

http://server.app/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fclient.app%2Fcallback&response_type=code&scope=

返回:

http://client.app/callback?code=access_token

问题:

如何使用 client.app 中指定的access_token向 server.app 提出正确的请求,以获取用户的电子邮件

我应该使用:http://server.app/api/user请求获取数据吗?如果是的话,我怎么能这样做?如果可能,请写一个代码。

感谢您的回答。

3 个答案:

答案 0 :(得分:31)

我对这个问题一直非常疯狂!在尝试查找Unauthenticated等路线时,为什么它一直在吐出愚蠢的/api/user错误,这一点毫无疑问。经过多次搜索(多次搜索),我终于找到了答案。如果你从Laracasts看到这个fero,你就是我的英雄!

  

您检查过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

修改

如果您对上述app\Providers\RouteServiceProvider.php进行了更改,请继续执行以下示例。

首先,我们需要检索一个新的access_token。为此,我使用密码 grant_type(更多信息:https://laravel.com/docs/5.4/passport#password-grant-tokens

要检索新的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);
});

使用Chrome Postman,您需要:

  1. 将方法设置为GET
  2. 输入带有相关参数的连接网址,即http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&username=test@test.com&password=123456
  3. 点击标题标签(授权旁边的标签),添加Accept密钥和值application/json
  4. 点击发送按钮
  5. 示例结果:

    {
      "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="
    }
    

    突出显示access_token字符串并将其复制到文本编辑器。

    然后您需要在routes/api.php中创建新路线。下面的路线将只输出当前的API用户'信息:

    Route::group(['prefix' => 'user'], function() {
        Route::get('/', function() {
            return response()->json(request()->user());
        });
    });
    

    完成上述操作后,请对Postman进行以下更改:

    1. 将方法设置为GET
    2. 更改网址以指向API路线,即http://example.com/api/user
    3. 再次点击标题标签,添加Authorization的新密钥和Bearer access_token_here的值(将access_token_here替换为您之前复制的访问令牌)
    4. 点击发送按钮
    5. 示例输出:

      {
        "id": "75ced500-1544-11e7-9a8e-ad5f1aee389e",
        "name": "test test",
        "email": "test@test.com",
        "created_at": "2017-03-30 23:29:03",
        "updated_at": "2017-03-30 23:29:03"
      }
      

答案 1 :(得分:4)

你试过在POSTMAN chrome app上运行吗? 如果没有,请下载它。 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en

填写信息。 enter image description here

成功生成数据后,单击右上角的CODE按钮(我用绿色突出显示)。

最后,选择您的语言并复制代码。对于PHP,我选择了php cURL。

希望它有效。

答案 2 :(得分:2)

根据Laravel documentation,您应该添加到服务器应用的路由(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');

通过quzzle提出请求:

$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);
echo $response->getBody();