【问题标题】:How to use Laravel Passport with Password Grant Tokens?如何将 Laravel Passport 与密码授予令牌一起使用?
【发布时间】:2018-11-23 17:22:37
【问题描述】:

我刚刚阅读了https://laravel.com/docs/5.6/passport 文档,我有一些疑问,希望有人可以帮助我:

首先,在某些情况下,我想使用 Passport 为我的移动应用(第一方应用)提供 Oauth 身份验证。

  1. 当我使用 php artisan passport:client --password 时,我会返回一个客户端 ID 和一个客户端密码。这个值是否必须在我的应用程序上固定?例如将它们存储为硬编码或作为“设置”文件?如果不应该存储这些值,那么它应该如何工作?

  2. 要将用户注册到我的应用程序,我使用:$user->createToken('The-App')->accessToken; 我知道 accessToken 将用于在我的所有请求中作为 Header(授权 => Bearer $accessToken)发送,但究竟是什么“The-App”的价值?

  3. 对于登录用户,我使用 URL:http://example.com/oauth/token 并作为参数发送:

    { "用户名": "user@email.com", “密码”:“用户密码”, "grant_type": "密码", "client_id": 1, // 我从命令中得到的客户端 ID(问题 1) "client_secret": "Shhh" // 我从命令中得到的客户端密码(问题 1) }

  4. 当我使用上一个端点登录用户时,我得到了一个 refresh_token,我读到我可以通过 http://example.com/oauth/token/refresh 刷新令牌,但我尝试请求刷新我得到错误 419,我删除了 url oauth/token/从 csrf 验证刷新,现在我返回 "message": "Unauthenticated.",我提出以下请求:

    内容类型:x-www-form-urlencoded 授予类型:刷新令牌 refresh_token: the-refresh-token // 我从命令中得到的刷新令牌(问题 3) client_id: 1 // 我从命令中得到的客户端 ID(问题 1) client_secret: Shhh // 我从命令中得到的 Client Secret(问题 1) 范围:''

我应该使用这个端点吗?或者鉴于我正在尝试开发的应用程序,这不是必需的。

  1. 最后,我从护照中获得了很多我认为不会使用的端点,例如:oauth/clients*oauth/personal-access-tokens* 有没有办法从护照发布的端点中删除它们?

非常感谢您的帮助!

【问题讨论】:

  • 对于密码授予,您不能使用$user->createToken('The-App')->accessToken; 生成访问令牌
  • 嗨@Wellwisher 你能告诉我为什么我不能使用那个选项吗?
  • 该选项用于生成个人访问令牌,并且在您的代码中您使用了密码大。要生成令牌,请使用此方法laravel.com/docs/5.6/passport#requesting-password-grant-tokens

标签: php laravel oauth laravel-passport


【解决方案1】:

如果您使用自己的 api,则无需致电 http://example.com/oauth/token 用于用户登录,因为您需要在应用程序端存储 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_idclient_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

【讨论】:

  • jagadeshanh.wordpress.com/2016/12/27/… 很久以前写过这篇文章。还是可以作为参考的。
  • 只是好奇,多年来我一直在使用 API,API 提供者总是提供 client_id 和 client_secret 进行身份验证。为什么我们在 laravel 护照中需要电子邮件和密码?
  • @amansoni211 是的,你是对的,但在这种情况下,我们通常从服务器端调用这些 api。这里的问题是在应用程序端使用client_idclient_secrect,因此您不能将其存储在客户端。希望它可以清除你
  • @rkj 解释得很好,谢谢。如果需要将我的 API 公开给最终会从他们的网络服务器访问我的 API 的业务合作伙伴,您会建议 [在护照中] 采用哪种身份验证方法?
【解决方案2】:

解决问题 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

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 2017-12-14
    • 2017-10-05
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-03-31
    相关资源
    最近更新 更多