Restful Web 服务认证

2024-01-10

我有一个 Restful Web 服务 API,正在被不同的第 3 方使用。该 API 的一部分受到限制(您需要用户名/密码才能访问它)。我想知道实施身份验证的最佳方法是什么?

我使用的是 https,因此通信是加密的。我有两个想法:

  • 在用户开始使用(受限)服务之前,它使用 POST 发送用户名/密码(因为使用 https 凭据已加密)。登录成功后,服务器发送回与该用户名匹配的随机单次使用值(nonce)。当发出下一个请求时,客户端会连同用户名一起发送之前返回的随机数。服务器匹配用户名和随机数,并返回新的随机数以及请求的数据。每个新请求都使用新的随机数。基本上,这是摘要式访问身份验证的轻量级版本。
  • 由于此 API 是从第 3 方使用的,因此每个(受限)请求都可以使用用户名/密码。由于使用 https,它们将被加密。这种方法的缺点是它不符合 Restful 标准(始终使用 POST)。

我更倾向于选择第一种方法(它符合 Restful 标准,相对容易实现,可以使用 XML、json 或 html,无需更改任何内容),但我想看看您的意见是什么?您建议什么:第一种、第二种还是第三种方法?

顺便说一句,我在服务器端使用Python。


我在 API 中看到的一种方法(以及当前实现它的方法)是创建一个名为的 RESTful 资源Session这是通过创建POST它提供用户名和密码。

这基本上是我的实现方式:

POST /sessions { Username: "User", Password: "Password" }

创建一个限时会话并返回包含会话密钥值和过期时间的会话资源。您可能还希望将其作为 cookie 值返回,以方便 API 客户端的实现。

DELETE /session/{id}

会话立即过期,因此无法再使用。这用于显式退出。

然后,我让用户通过查询参数附加会话密钥,尽管您也可以允许通过 cookie 值提交它,但我建议允许两者都允许。

我更喜欢这个的是它非常简单。

显然,您的场景将在某种程度上决定您的会话应该如何管理,也许它们没有时间限制并且无限期地持续,并且也许它们被散列或加密以增加安全性。

如果您在任何地方都使用 HTTPS,您可能不需要太担心。但是,如果您想使用 HTTP,则需要使用哈希之类的内容以及密钥,并指定时间戳来为每个请求生成安全密钥。这样您就可以通过 HTTPS 共享密钥,然后切换到 HTTP 进行进一步的调用。即使有人设法从请求中嗅出密钥,它也几乎会立即过期并且毫无用处。

免责声明:我不是安全专家;-)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Restful Web 服务认证 的相关文章

随机推荐

  • 线程池中的 Guice DAO 提供程序 - 查询变为“事务中空闲”

    我使用 Java 8 Hibernate 5 1 0 Final 和 Guice 4 1 0 Inject private Provider
  • Laravel 5 控制台(工匠)命令单元测试

    我正在将 Laravel 4 2 应用程序迁移到 5 1 从 5 0 开始 并且我的控制台命令单元测试遇到了很多麻烦 我有 artisan 命令 我需要测试生成的控制台输出 正确的问题 响应处理以及与其他服务的交互 使用模拟 尽管 Lara
  • R 在正则表达式中使用变量

    好吧 也许这是一个更好的例子 我正在寻找有关如何在正则表达式中引用变量的指南 参考 而不是如何为此数据构建正则表达式 如何使用变量中的值来正则表达式下一个变量 library plyr library tm library stringr
  • Apache Flink 与 Elasticsearch 集成

    我正在尝试将 Flink 与 Elasticsearch 2 1 1 集成 我正在使用 Maven 依赖项
  • 将 jsonb 数组中的对象取消嵌套到单独的行中

    我在 Postgres 14 9 中有一个表 Name Txt Detail JSONB state JSONB apple code 156 color red code 156 color blue ap good op2 bad or
  • 使用不等于、!= 访问多个项目

    我有以下 Pandas DataFrame 对象df 这是一份列出出发日期 预定出发时间和火车公司的火车时刻表 import pandas as pd df Year Month DayofMonth DayOfWeek Departure
  • 将指向堆栈变量的指针传递给 realloc() 是否有效?

    int main char myString NULL realloc myString 5 strncpy char myString test 5 似乎工作正常 但我仍然对堆栈与堆有点困惑 这是允许的吗 如果允许的话myString需要
  • 如何保持 Logstash 运行以便将数据从 RDBMS 同步到 ES?

    我是 ELK 堆栈的新手 所以请原谅我的无知 我已经能够让 Logstash 将数据从我的数据库发送到 Elasticsearch 但传输完成后它就会退出 我如何保持它运行以使它们保持同步 谢谢 您需要指定一个schedule https
  • 强制 linux 排序使用字典顺序

    我生成了一个带有伪随机数的文本文件 如下所示 853340442 1130519212 2070936922 707168664 2076185735 2135012102 166464098 1928545126 5768715 1060
  • 在迭代 Python 字典时修改它

    假设我们有一个 Python 字典d 我们像这样迭代它 for k v in d iteritems del d f k remove some item d g k v add a new item f and g只是一些黑盒转换 换句话
  • 如何防止在更改源列表时调用 ComboBox Change 事件

    TL DR 如何防止在源列表中添加或删除项目时触发 ActiveX ComboBox 请注意我见过这个帖子 https stackoverflow com questions 19276861 how to prevent activex
  • 按钮周围的虚线边框

    我试图在按钮周围绘制虚线边框 但是边框没有出现 不确定我在这里做错了什么 你能帮忙吗 我的 Xaml 代码
  • 在大型 MySQL 表中添加新列

    在大型 MySQL 表中添加新列的最快方法是什么 ALTER TABLE ADD COLUMN创建完整表的副本 然后用新创建的表替换旧的副本 当此进程运行时 原始表是可读的 但所有插入和更新都会停止 在大型表上 复制可能需要很长时间 有什么
  • 如何将 mechanize.Browser() cookie 保存到文件?

    我怎样才能使Python的模块mechanize 特别是mechanize Browser 将其当前的cookie保存到人类可读的文件中 另外 我该如何将该 cookie 上传到网页上呢 Thanks Deusdies 我刚刚参考了 Myk
  • gRPC 客户端不处置 Channel

    我正在使用 gRPC 开发 net core 2 0 应用程序并发现一个问题 删除对 gRPC 客户端类实例的引用后 仍然存在使用资源 内存和处理器 的通道 示例代码 public class MyClient ClientBase pub
  • 软标签上的 scikit-learn 分类

    根据文档 可以指定不同的损失函数SGDClassifier 据我了解log loss is a cross entropy理论上可以处理软标签的损失函数 即以一些概率 0 1 给出的标签 问题是 是否可以使用SGDClassifier wi
  • 在WSO2 ESB 4.7.0中,我们可以在接收序列中进行JMS回滚吗?

    我已经在 WSO2 ESB 4 7 0 中配置了带有事务和 CLIENT ACKNOWLEDGE 的 Apache ActiveMQ axis2 xml 配置是
  • Intellisense 不工作 golang 测试文件

    标题说明了一切 我打开一个测试文件 类型 package 什么也没有出现 这不是延迟问题 这不是一个空包裹 如何开启智能感知 更新 我已经向 VSCode Golang 团队提交了错误通知单 当我们找到更多信息时 我会在这里报告 https
  • ctypes:将字符串转换为函数?

    我正在读这篇文章在笔测试期间逃避防病毒软件的技巧 http pen testing sans org blog pen testing 2011 10 13 tips for evading anti virus during pen te
  • Restful Web 服务认证

    我有一个 Restful Web 服务 API 正在被不同的第 3 方使用 该 API 的一部分受到限制 您需要用户名 密码才能访问它 我想知道实施身份验证的最佳方法是什么 我使用的是 https 因此通信是加密的 我有两个想法 在用户开始