当前位置: 首页 > 知识库问答 >
问题:

当服务受API密钥保护时,如何使Swagger/Postman插件工作

夏宏旷
2023-03-14

在我的ServiceStack web服务中,我有一个全局请求过滤器,用于检查头部是否存在API密钥(X-FooKey),该检查防止加载Swagger/Postman UI。我通过检查dto类型并将其与邮递员的dto进行比较,为邮递员创建了一个可怕的黑客程序,同样,它不是很健壮。另一方面,大摇大摆是一团糟,我真的不想模仿我对邮递员的做法,所以我愿意接受建议。

最终,我希望两个插件都能够自动提供密钥,但这很可能需要PR,考虑到我的时间限制,这是不现实的。

谢谢你斯蒂芬

共有1个答案

张唯
2023-03-14

在我们当前的项目中,我们遇到了相同的问题。我们将swagger插件用于servicestack,并为API密钥提供自定义请求头。我们通过编辑swagger ui/index.html很容易解决了这个问题。缺点是不能让nuget更新文件,也不能手动合并。

使用api键的额外输入扩展html表单

<form id='api_selector'>
    <div id="login-logout">
        <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text" /></div>
        <div class='input'><input placeholder="username" id="input_username" name="username" type="text" /></div>
        <div class='input'><input placeholder="password" id="input_password" name="password" type="password" /></div>
        <div class='input'><a id="login" href="#">Login</a></div>
    </div>
</form>

javascript片段中更改apiKeyName:

window.swaggerUi = new SwaggerUi({
    apiKey: "",
    apiKeyName: "x-fookey"
});

然后编辑登录功能:

$('#login').on('click', function (event) {
    event.preventDefault();

    var apiKey = $('#input_apiKey').val();
    var username = $('#input_username').val();
    var password = $('#input_password').val();

    $.ajax({
        url: '../api/auth/credentials',
        type: 'POST',
        data: {
            UserName: username,
            Password: password
        },
        beforeSend: function (xhr) {
            xhr.setRequestHeader('X-FooKey', apiKey);
        }
    });
});

在我们的API中,我们只需要登录请求上的apikey标头。要将其添加到每个请求中,请参阅此SO问题:如何让Swagger将API密钥作为超文本传输协议而不是在URL中发送

 类似资料:
  • 问题内容: 我想使pdf文件受密码保护。我只是对它进行了搜索,并在下面找到了一个好的解决方案。它工作正常,但是使用下面给定的代码保护pdf后,它会清除pdf中已经存在的所有数据。 此代码使用的jar文件是: itextpdf-5.2.1.jar bcmail-jdk16-1.46.jar bcprov-jdk16-1.46.jar bctsp-jdk16-1.46.jar 保护PDF的代码: 我需

  • 我试图保护Spring BootAPIendpoint。我希望只传递api密钥和秘密作为头的一部分来调用api。我尝试了这个链接中发布的代码。但是在头中使用授权调用api时拒绝访问。使用API key和secret保护Spring Boot API我想知道我应该作为头部的一部分传递什么,这样我就可以从API获得成功的响应。我做了以下步骤:我在application.properties中添加了以下

  • 我想保护Spring Boot API,使它只对具有有效API密钥和秘密的客户机是可访问的。但是,由于所有数据都是匿名的,程序内部没有身份验证(使用用户名和密码的标准登录)。我试图实现的只是所有API请求都可以仅用于特定的第三方前端。

  • 问题内容: 马克·墨菲(Mark Murphy)在他的博客上很好地说明了应将哪些信息排除在公共存储库之外。密钥材料(例如用于各种服务的OAuth密钥或API密钥)就是一个很好的例子。 有问题的应用程序将是移动android应用程序,因此有人对其进行反编译以获取秘密密钥不在此问题范围内。 如何配置公共CI实例(例如cloudbees)上的构建作业,以使机密不泄漏到构建日志或编译目录中?我的主要目的是

  • 问题内容: 我想对已经列出我们公司产品的本地在线商店进行API调用,然后返回其详细信息,标签,照片等的JSON。除了保护我的API密钥之外,不包括敏感信息。 如何保护我的API密钥并向另一个网站发出GET / POST请求? 问题答案: 要向访问您网站的访问者隐藏API密钥,请在您自己的网站上使用PHP脚本充当中继。它接收Ajax请求(没有API密钥);添加您的密钥并发出自己的API请求;然后将响

  • 我正在使用AES加密实现一个加密字符串的程序,并希望将我的“密钥”保存在一个文件中,而不是在源代码中硬编码。 但是,这给我带来了一个问题,我如何保护这个秘密密钥不被他人看到? 如果我要再次加密这个“密钥文件”,我将不得不再次处理同样的问题。 我该如何处理这些问题? 参考:https://wiki.sei.cmu.edu/confluence/display/java/MSC61-J.不要使用不安全