【问题标题】:Laravel Passport Password Grant Refresh TokenLaravel Passport 密码授予刷新令牌
【发布时间】:2018-02-01 17:59:00
【问题描述】:

尝试将 Laravel 的 Passport 与移动客户端一起使用。密码授予类型的身份验证似乎是要走的路,我让它与我的 iOS 应用程序一起使用,但是我无法让令牌刷新工作。

在进行身份验证时,我得到一个 token 和一个 refresh token 我存储,但是当令牌过期时,调用 oauth/token/refresh 路由不起作用。该路由正在使用 web 中间件,这意味着我使用 api 路由的应用程序无法访问它。我不确定他们是否打算让移动客户端永远不会刷新,或者他们是否希望您自己进行刷新?如果有人知道这应该如何工作,那就太好了。

【问题讨论】:

    标签: php ios laravel authentication laravel-passport


    【解决方案1】:

    oauth/token/refresh 路由不用于刷新访问令牌。它用于刷新临时令牌,当您从 javascript 使用自己的 API 时会使用这些令牌。

    要使用您的refresh_token 刷新您的访问令牌,您需要使用grant_typerefresh_token 调用oauth/token 路由。

    这是the documentation提供的例子:

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

    关于范围的注意事项,当您刷新令牌时,您只能获得与原始访问令牌相同或更窄的范围。如果您尝试获取原始访问令牌未提供的范围,则会收到错误消息。

    【讨论】:

    • 哇,我不知道那是怎么逃脱我的,我想我只是假设我会调用一个完全不同的路由来刷新令牌。谢谢!
    • 嘿,你有没有让这个工作?我有同样的问题,我的设置与上面的完全一样。我已经尝试了一切,它让我发疯,这是我收到的错误消息。 League\OAuth2\Server\Exception\OAuthServerException:请求缺少必需参数,包含无效参数值,包含多次参数,或者格式错误。
    • 如果你能帮助我解决你的问题,那就太棒了。您是将刷新令牌存储在 cookie 中还是直接从浏览器传递?不推荐..
    • Ufff,这不在 Laravel 护照文件中,我想我查过但没有找到,谢谢!!
    【解决方案2】:

    我做过类似的事情。

    1. 为授予刷新令牌创建了一个端点。

    在我的控制器中,

    public function userRefreshToken(Request $request)
    {
        $client = DB::table('oauth_clients')
            ->where('password_client', true)
            ->first();
    
        $data = [
            'grant_type' => 'refresh_token',
            'refresh_token' => $request->refresh_token,
            'client_id' => $client->id,
            'client_secret' => $client->secret,
            'scope' => ''
        ];
        $request = Request::create('/oauth/token', 'POST', $data);
        $content = json_decode(app()->handle($request)->getContent());
    
        return response()->json([
            'error' => false,
            'data' => [
                'meta' => [
                    'token' => $content->access_token,
                    'refresh_token' => $content->refresh_token,
                    'type' => 'Bearer'
                ]
            ]
        ], Response::HTTP_OK);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2018-11-23
      • 1970-01-01
      • 2019-12-22
      • 2017-10-05
      • 2017-12-14
      • 2020-09-14
      • 2018-02-21
      • 2020-09-08
      相关资源
      最近更新 更多