dingo 配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dingo 配置相关的知识,希望对你有一定的参考价值。

参考技术A

Dingo包的大多数配置都预先设置好了,这样你就可以尽快的进入开发模式了,我们也可以参照 config/api.php 中的 env() 函数中的内容在 .env 文件中去设置。

当然也可以使用 AppServiceProvider 中的 boot 进行设置
(这个怎么设置???)

提示: 如果你使用Laravel5,那么必须使用Dingo生成的配置文件 config/api.php 或者是使用 Service Provider 设置。

生成config/api.php的方法

Standards Tree

一共提供了3种tree, x, prs, vnd
x: unregistered tree 本地或是私有环境
prs: personal Tree 项目不是用于商业发布的
```vnd: vender tree`` 用于公开的商业项目

在 .env 文件中这样配置

还是不理解 x, prs, vnd ???

Subtype

subtype 是项目或工程的简称,全部小写

前缀和子域名
通常对于api,我们会使用子域名或者是位于/api栏目下,两者只要使用一个就可以了,注意不要添加版本号到子域名或者是/api下,版本号会有header的 Accept 处理

版本 Version

两个作用:1,它是默认的版本号或者是没有提供版本号,使用这个,2是在生成api文档的时候会使用该版本号

名字 Name
API_NAME 的唯一作用是在使用API Blueprint命令生成文档的时候会使用,这样可以省去手动书写名字

带条件的请求

由于缓存API请求的时候会使用客户端的缓存功能,所以默认是开启了带条件的请求,如果要关闭这项

严格模式
严格模式要求客户端发送Accept头代替.env文件中的version,意味着不能通过浏览器访问api。

如果Strict模式开启并且使用了无效的Accept头,API会抛出一个Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException异常。

你可以在.env中配置这个选项:

认证提供者

默认情况下,只有 basic 认证是可以用的,后面的章节会用更多的介绍,如果需要复杂功能的认证,你需要注册服务提供者

登录次数限制

默认情况下,是限制登录次数的,你可以通过rate limiter注册自定义登录次数限制,也可以使用系统自带的认证和取消认证的throttle模块。
要进行更为复杂的操作,也是需要注册服务提供者的

数据返回Response Transformer

Fractal 是默认的数据返回处理Transformer.
我们可以在 .env 文件中设置,
在 config/api.php 中有

也不可以不用上面的方法,也可以注册成服务提供者,这样可以用更多的功能:

上面这个不知道怎么用,其实可以自己建立一个Transformer文件夹,如针对User Model,声明UserTransformer 类,并继承TransformerAbstract 类(laravist上这么用)

返回格式 Response Formats

默认的数据以json进行前后端的传递,你也可以自己定义

更高级的数据格式,如使用可以跨域访问的 jsonp ,需要在 config/api.php 中设置,或者是注册成服务提供者

错误返回格式

这个非常重要,以前经常是抛出异常,错误提示非常不友好,不规范,一定要在 config/api.php 中定义好错误格式:下面是默认的,我们需要讨论讨论,搞个自己的错误格式

开启Debug模式

Laravel 5.4 OAuth 与 Dingo 内部请求

【中文标题】Laravel 5.4 OAuth 与 Dingo 内部请求【英文标题】:Laravel 5.4 OAuth with Dingo internal requests 【发布时间】:2018-05-03 03:53:00 【问题描述】:

我正在使用带有 Dingo API 的 Laravel 5.4,并且我正在尝试让 Laravel 的 OAuth 2.0 (Passport) 处理内部 Dingo 请求。以前,我使用的是 JWT,但现在我希望使用 OAuth。这是我之前的调度程序代码,它传递所需的令牌以对内部请求执行身份验证。

public function getDispatcher()

    $token = JWTAuth::fromUser(Auth::user());
    return $this->api->header('Authorization','Bearer'.$token)->be(Auth::user());

现在我使用 OAuth 进行身份验证,我的 JavaScript 代码只需通过 JavaScript 中的passing a cookie using this method 即可获得身份验证,效果很好。

现在我需要修改 getDispatcher() 方法以在 Dingo 中的“内部请求”中获取 OAuth 令牌。有没有人有关于如何做到这一点的任何提示?从理论上讲,我可以为每个用户创建一个个人访问令牌,但这对于内部请求来说似乎有点过头了。任何建议或方法表示赞赏。如何在不通过完整的 OAuth 流程的情况下获取 OAuth 令牌,或者如何仅针对内部请求关闭身份验证。

根据以下答案更新:

'api.auth' 在路由上独立运行(只是 Dingo)并且内部请求有效。 auth:api (Passport) + api.auth 我得到了内部请求中不允许的方法,它以 JSON 形式返回。 "message":"405 Method Not Allowed" 现在尝试调用内部 POST 请求时。 (看起来在尝试 POST 到这些路由时会发生 301 重定向到登录页面,进而导致 API 路径以某种方式变成 GET 从而引发 405 错误)。

通过 Postman 的 API 请求以相反的方式工作。当 (auth:api just Passport) 都处于活动状态时找不到用户 (['middleware' => ['auth:api','api.auth']) 工作正常。

【问题讨论】:

看看这对esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4有帮助吗? 【参考方案1】:

如果我没看错问题,看起来我们正在尝试同时使用两个身份验证提供程序——Dingo's 和 Passport。如果我误解了,请纠正我,但似乎我们实际上不需要在这个项目中同时使用两者。对于大多数应用程序,我们可以使用 Passport 执行身份验证,并将结果简单地传递给 Dingo。

我们通过创建一个custom authentication provider 来实现这一点,它将 Dingo 与 Passport 执行的身份验证联系起来:

use Dingo\Api\Contract\Auth\Provider;
use Illuminate\Auth\AuthManager;
...
class PassportDingoAuthProvider implements Provider

    protected $guard;

    public function __construct(AuthManager $auth) 
    
        $this->guard = $auth->guard('api');
    

    public function authenticate(Request $request, Route $route)
    
        if ($this->guard->check())  
            return $this->guard->user();
        

        throw new UnauthorizedHttpException('Not authenticated via Passport.');
    

如我们所见,上面显示的 Dingo 身份验证提供程序只是挂钩到 Laravel 身份验证系统,以在通过身份验证时转发 User。构造函数中指定的'api' 守卫应该与configured for Passport 守卫相匹配(我们通常在config/auth.php 中的'guards' 数组中添加一个'api' 条目):

'guards' => [
    ...
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

然后,我们需要在config/api.php中向Dingo注册自定义提供者:

'auth' => 
    'passport' => App\Providers\PassportDingoAuthProvider::class
]

现在我们可以声明使用 Passport 身份验证中间件 (auth:api) 和 Dingo 身份验证中间件 (api.auth) 的受保护路由:

$api->get('endpoint', function ()  ... )->middleware('auth:api', 'api.auth');

如果需要,我们可以在 app/Http/Kernel.php 中创建一个 middleware group 来组合这些:

protected $middlewareGroups = [
    ...
    'auth:api-combined' => [
        'auth:api', // Passport
        'api.auth'  // Dingo
    ]
];

当应用程序需要调用内部 API 时,客户端应该已经通过身份验证,因为典型的 Laravel 应用程序在中间件堆栈中处理身份验证。如您所知,如果需要,我们可以简单地将经过身份验证的 User 传递给 Dingo 端点:

return $this->api->be(auth()->user())->get('endpoint');

...但是对于上面显示的身份验证提供程序,这应该不是必需的。 Dingo 将从 Passport 的 auth guard 中解析出经过身份验证的用户。

a sample project 结合了这些概念。

现在我正在使用 OAuth 进行身份验证,我的 Javascript 代码只需通过在 Javascript 中使用此方法传递一个 cookie 即可获得身份验证...我需要修改 getDispatcher 方法以获取“内部”上的 OAuth 令牌在 Dingo 中请求。

当我们使用CreateFreshApiToken middleware 时,Laravel 会即时生成一个加密的 JWT。我们可以手动创建以下令牌之一:

use Firebase\JWT\JWT; // installed with Passport
...
$token = JWT::encode([
    'sub' => auth()->id(),
    'csrf' => session()->token(),
    'expiry' => Carbon::now()->addMinutes(config('session.lifetime')),
], app('encrypter')->getKey());

我们可以看到这不是标准的 OAuth 访问令牌 - Passport 仅将这些用于 Web 请求。或者,我们可以从 JavaScript 传回的 cookie 中获取这个值:

$token = request()->cookie(Passport::cookie());

但是,如果我们如上所述将 Dingo 与 Passport 集成,则不需要此令牌。

【讨论】:

这看起来很棒..会让你知道我的进展情况。 尝试了描述的解决方案.. 不幸的是接近但没有雪茄。一个示例 git 项目可以很好地查看结构,但我的直觉是我在中间件 atm 中遗漏了一些东西。 @Paul 今天或明天有时间我会尝试将示例项目放在一起。 那太棒了。感谢到目前为止所花费的时间。 @Paul 解决更新问题:确保我们调用 $dispatcher->post('internal-endpoint') 而不是 get() 来解决 405 错误。如果没有真正的访问令牌,使用 Postman 的请求将无法工作,因为我们没有收到 CreateFreshApiToken 发送的 Passport 的 JWT。这是a sample project,应该可以提供一些想法。

以上是关于dingo 配置的主要内容,如果未能解决你的问题,请参考以下文章

laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

Laravel配置DingoAPI和JWT

php 加载Dingo / API,如果它是Dingo / API请求。

如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化

如何用流明5.8中的dingo修复实现jwt。*?目标[Dingo Api Contract Routing Adapter]不可实例化

在没有 Lumen/Laravel 会话的情况下使用 Lumen + Dingo + JWT