首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据需要auth令牌的API验证契约?

如何根据需要auth令牌的API验证契约?
EN

Stack Overflow用户
提问于 2016-11-24 03:13:15
回答 2查看 3K关注 0票数 2

我正在使用协约宝石(而且很喜欢它!)我的合同测试套件。我正在测试的API服务对所有请求都需要一个授权令牌。

我知道如何为我的用户生成一个API令牌,但我不知道如何将令牌放在契约工作流中。我搜索了契约文档和回购,但没有任何运气。

我试图在使用者规范中发送一篇文章来生成令牌,但是consumer模拟服务器不知道如何处理请求和错误(正如我所期望的)。

我找到了这个例子,它似乎很有希望,特别是能够使用requestFilteraddHeader方法为所有请求分配预定义的头。

我如何使用这样的请求筛选器与契约创业板?

如果这不是一个当前的功能,我有什么选择?

更新:

X的回答对于创建与模拟服务器的契约非常有用,但它并不能满足API服务提供者对有效的auth令牌的期望。更具体地说,在运行pact时,我需要动态地将有效的auth令牌插入到契约中:验证。因此,再近一步,但仍需弄清楚后半部分。

马修的回答包含一些提示,为后面的部分提供了两种可能的解决方案(pact:验证)。我不太愿意引入另一个依赖项,所以我很想让ProxyApp类示例正常工作。但是,我不知道我到底会把什么传递到ProxyApp.new()中。有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2016-11-24 03:55:31

实际上,除非您真的想/需要,否则您不必为每个契约交互使用真正的令牌。

通常,对于这类内容,我只需创建一个正则表达式,用于在标题上验证某些规则,同时保持其“打开”。在我的节点项目(在后面使用Ruby二进制文件)中,我创建了这2个实用程序函数来创建具有模式的对象,并为对象最小值创建另一个函数:

代码语言:javascript
复制
function term(matcher, generate) {
    if ((typeof matcher === 'undefined') || (typeof generate === 'undefined')) {
      throw 'Matcher and Generate arguments must be specified to use Term';
    }
    return {
      "json_class": "Pact::Term",
      "data": {
        "generate": generate,
        "matcher": {
          "json_class": "Regexp",
          "o": 0,
          "s": matcher
        }
      }
    };
  }

  function somethingLike(value) {
    return {
      "json_class": "Pact::SomethingLike",
      "contents": value
    };
  }

然后,您可以在DSL定义中使用它,如下所示:

代码语言:javascript
复制
mockService
      .given('a form')
      .uponReceiving('a GET request with a valid auth')
      .withRequest('get', '/', term('^Bearer (?!null$).+$', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'))
      .willRespondWith({
        status: 200,
        headers: {'Content-Type': 'application/json;charset=utf-8'},
        body: {worked:true}
      });

“术语”实用程序有一个正则表达式作为第一个参数,然后是测试期间使用的示例(应该与第一个参数匹配)。

我知道,需要在“契约”本身内更好地扩大这一范围,使其更易于使用。我希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2016-11-24 21:36:39

契约的Ruby实现并不像JVM实现那样直接支持这一点。

如果您正在使用,您可以查看https://github.com/realestate-com-au/pact/issues/49#issuecomment-65346357https://groups.google.com/forum/#!topic/pact-support/tSyKZMxsECk中讨论的一些选项。

一个例子看起来可能类似于:

代码语言:javascript
复制
class ProxyApp

  def initialize real_app
    @real_app = real_app
  end

  def call env
    @real_app.call(env.merge('HTTP_AUTHORIZATION' => '12345'))
  end
end

Pact.service_provider "Some Provider" do
  app do
    ProxyApp.new(RealApp)
  end

  honours_pact_with "Some Consumer" do
    #...
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40777493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档