有关 OAuth Client Credentials 授权方式的疑问

我不知道这算不算是伪需求。
情况是这样的
我有一个Server A,现在有个第三方Server B

现在A 提供了OAuth认证(Client Credentials)
这样B就可以跟A进行通讯。

但是有个问题,因为使用的不是Auth Code 方式。
服务端验证是无法使用 auth:api中间件的。
使用的是\Laravel\Passport\Http\Middleware\CheckClientCredentials

如此一来,Server A就不知道是哪个客户端进行的通讯。

我目前的做法是

$tokenRepository = new TokenRepository();
$jwt = (new Parser())->parse(Request::bearerToken());
$token= $tokenRepository->find($jwt->getClaim('jti'));

从Token里把Client ID取出来,自己去数据库oauth_clients表里检索相关记录。
取出来user_id。

但是不知道有什么正统点做法么???

PS:Auth Code方式,在此场景并不适用。

不不不,请叫我现代农民工。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

这问题问了一年了也没个回答。
今天偶然又看到了,顺手自己答了吧。

首先要说明下,两Server之间通讯,通过OAuth方式就不是一个好的方案。不过这个不在本文讨论范围内。

做一个中间件。继承框架自带的CheckClientCredentials,重写handle方法。

public function handle($request, Closure $next, ...$scopes)
    {
        $psr = (new DiactorosFactory)->createRequest($request);
        try {
            $psr = $this->server->validateAuthenticatedRequest($psr);
            //设置client_id
            $request['client_id'] = $psr->getAttribute('oauth_client_id');
        } catch (OAuthServerException $e) {
            throw new AuthenticationException;
        }
        $this->validateScopes($psr, $scopes);
        return $next($request);
    }

主要就是

$request['client_id'] = $psr->getAttribute('oauth_client_id');

这句。
如此一来,就可以在Controller中从$request 获取client_id了。

5年前 评论
讨论数量: 5

大家都没用到这功能么。。。。还是说木有大神愿意帮帮我。。。。

6年前 评论

这问题问了一年了也没个回答。
今天偶然又看到了,顺手自己答了吧。

首先要说明下,两Server之间通讯,通过OAuth方式就不是一个好的方案。不过这个不在本文讨论范围内。

做一个中间件。继承框架自带的CheckClientCredentials,重写handle方法。

public function handle($request, Closure $next, ...$scopes)
    {
        $psr = (new DiactorosFactory)->createRequest($request);
        try {
            $psr = $this->server->validateAuthenticatedRequest($psr);
            //设置client_id
            $request['client_id'] = $psr->getAttribute('oauth_client_id');
        } catch (OAuthServerException $e) {
            throw new AuthenticationException;
        }
        $this->validateScopes($psr, $scopes);
        return $next($request);
    }

主要就是

$request['client_id'] = $psr->getAttribute('oauth_client_id');

这句。
如此一来,就可以在Controller中从$request 获取client_id了。

5年前 评论
山野村夫

Client Credentials 授权方式是不是取不到用户信息?我试了一下 auth()->user() 返回是 null

4年前 评论

@simechiang 是的,因为本身就没有User参与。是服务端对服务端的通讯。

4年前 评论
山野村夫

@harde 3Q

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!