基于 REST API 令牌的身份验证

2023-11-30

我正在开发一个需要身份验证的 REST API。由于身份验证本身是通过 HTTP 上的外部 Web 服务进行的,因此我推断我们将分配令牌以避免重复调用身份验证服务。这让我想到了我的第一个问题:

这真的比要求客户端在每个请求上使用 HTTP 基本身份验证并缓存对身份验证服务服务器端的调用更好吗?

基本身份验证解决方案的优点是在开始请求内容之前不需要与服务器进行完整的往返。令牌的范围可能更灵活(即仅授予特定资源或操作的权限),但这似乎比我更简单的用例更适合 OAuth 上下文。

目前代币的获取方式如下:

curl -X POST localhost/token --data "api_key=81169d80...
                                     &verifier=2f5ae51a...
                                     &timestamp=1234567
                                     &user=foo
                                     &pass=bar"

The api_key, timestamp and verifier所有请求都需要。 “验证者”由以下方式返回:

sha1(timestamp + api_key + shared_secret)

我的目的是只允许来自已知各方的呼叫,并防止呼叫被逐字重复使用。

这够好吗?杀伤力不足?矫枉过正?

有了令牌在手,客户可以获得资源:

curl localhost/posts?api_key=81169d80...
                    &verifier=81169d80...
                    &token=9fUyas64...
                    &timestamp=1234567

对于最简单的调用来说,这似乎非常冗长。考虑到shared_secret最终会被嵌入(至少)一个 iOS 应用程序中,我认为可以从中提取它,这是否提供了超越虚假安全感的任何东西?


让我将所有内容分开并单独解决每个问题:

验证

对于身份验证,baseauth 的优点是它是协议级别的成熟解决方案。这意味着很多“以后可能会出现”问题已经为您解决了。例如,使用 BaseAuth,用户代理知道密码是密码,因此他们不会缓存它。

验证服务器负载

如果您向用户分配令牌而不是在服务器上缓存身份验证,那么您仍然在做同样的事情:缓存身份验证信息。唯一的区别是您将缓存的责任转移给了用户。对于用户来说,这似乎是不必要的劳动,没有任何收益,因此我建议按照您的建议在服务器上透明地处理此问题。

传输安全

如果可以使用 SSL 连接,就足够了,连接是安全的*。为了防止意外多次执行,您可以过滤多个 url 或要求用户在 URL 中包含随机部分(“nonce”)。

url = username:[email protected]/api/call/nonce

如果这是不可能的,并且传输的信息不是秘密的,我建议使用哈希来保护请求,正如您在令牌方法中所建议的那样。由于哈希提供了安全性,因此您可以指示用户提供哈希作为基本身份验证密码。为了提高鲁棒性,我建议使用随机字符串而不是时间戳作为“随机数”,以防止重放攻击(同一秒内可以发出两个合法请求)。您可以简单地使用 api 密钥作为共享密钥,然后使用不会更改的盐来防止彩虹表攻击,而不是提供单独的“共享密钥”和“api 密钥”字段。用户名字段似乎也是放置随机数的好地方,因为它是身份验证的一部分。所以现在你有一个像这样的干净的调用:

nonce = generate_secure_password(length: 16);
one_time_key = nonce + '-' + sha1(nonce+salt+shared_key);
url = username:[email protected]/api/call

确实,这有点费力。这是因为您没有使用协议级解决方案(例如 SSL)。因此,向用户提供某种 SDK 可能是一个好主意,这样至少他们就不必亲自使用它。如果您需要这样做,我认为安全级别合适(just-right-kill)。

安全秘密存储

这取决于你想阻止谁。如果您阻止有权访问用户手机的人以用户的名义使用您的 REST 服务,那么最好在目标操作系统上找到某种密钥环 API 并让 SDK(或实现者)存储钥匙在那里。如果这是不可能的,您至少可以通过对其进行加密并将加密数据和加密密钥存储在不同的位置来使获取秘密变得更加困难。

如果您试图阻止其他软件供应商获取您的 API 密钥以阻止备用客户端的开发,则只能使用单独加密和存储的方法almost作品。这是白盒加密,迄今为止,没有人针对此类问题提出真正安全的解决方案。您至少可以做的是为每个用户颁发一个密钥,这样您就可以禁止滥用密钥。

(*) 编辑: SSL 连接不应再被认为是安全的没有采取额外步骤进行验证 them.

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

基于 REST API 令牌的身份验证 的相关文章

  • 如何在 Spring-Security 中重命名表 persist_logins

    Spring Security 中管理 记住我 身份验证的默认表名称是 persistent logins 由于数据库命名约定 我需要重命名该表 持久登录 to T PERSISTENT LOGINS 请提供任何帮助 您需要编写自己的实现J
  • 对于生成 json 以外的内容类型的操作,Swagger UI 会导致 HTTP 406 不可接受的响应

    我有一个用 Jersey 发布并用 Swagger 记录的 REST API 我还有一个使用该 API 的 Swagger UI 安装 我的几乎所有操作都会生成 application json 并按预期工作 除了一个 GET 操作会生成
  • 跨子域的 PHP 会话

    我正在尝试设置以下内容 auth example com sub1 example com sub2 example com 如果用户访问sub1 example com or sub2 example com他们没有登录 他们被重定向到a
  • Next.js 身份验证策略

    我一直在尝试为 Next js 项目实现可靠的身份验证流程 但现在我完全迷失了 我已经看过 Next js 的示例存储库 但我对完整的解决方案有很多疑问 我有一个express js API 和一个单独的Next js 前端项目 所有数据和
  • 为持久任务创建 REST API 的最佳方法?

    假设我有 2 台服务器 第一个是提供一些计算的服务 该计算可以持续很长时间 几分钟到几小时 第二个服务器将使用此服务来计算一些数据 我正在尝试为第一台服务器设计一个 REST API 到目前为止一切顺利 但我想听听一些关于如何在长期任务完成
  • 在 PHP 中处理 PUT/DELETE 参数

    我正在做我的CodeIgniter 的 REST 客户端库 http github com philsturgeon codeigniter restclient我正在努力弄清楚如何在 PHP 中发送 PUT 和 DELETE 参数 在一些
  • 使用 Spring MVC 进行基于角色的访问控制

    我想知道 Spring 基于角色的访问控制的最佳实践 我的要求是 我将向用户分配一组角色 例如 用户1 管理员 用户2 专家 user1 的访问权限如下所示 admin 会员管理 admin 项目管理 对于用户2 我的项目1 所以如果 us
  • Gmail REST API - 将邮件标记为已读

    我正在尝试使用 Gmail REST API 将邮件标记为已读 markGmailRead click function var request ajax type POST dataType json headers Authorizat
  • 具有 ISO 日期格式的 WCF REST JSON

    我在 WCF Web 服务 框架 4 0 中使用 JSON 支持 ISO 日期格式时遇到了一个大问题 我尝试了很多 但还没有运气 休息服务 WebInvoke Method PUT UriTemplate mvnoid OrderID Re
  • 在 Windows 应用程序中保存用户凭据

    是否有在 NET Windows 应用程序中存储凭据的最佳实践方法 无论是内置 API 还是只是推荐的加密算法 与 Tortoise SVN Spotify 和 Skype 一样 Edit 我的目的是使用一个从其身份验证服务返回令牌的 We
  • 用于控制器休息服务的 Spring Junit 测试用例

    我有一个响应 REST 调用的控制器 我有针对其他公共方法的各种测试用例 我不知道如何为我的控制器编写一个 RequestMapping value api frames method RequestMethod GET public Li
  • 姜戈。登录表单的错误消息

    我制作登录名 密码表格 model class LoginForm forms Form username forms CharField max length 100 password forms CharField widget for
  • Symfony 4 应用程序可与 Docker Compose 配合使用,但无法与 Docker Swarm 配合使用(无法登录,分析器损坏)

    我在用着Docker 组合本地 app容器 Nginx PHP FPM with a 交响乐4 app PostgreSQL容器 Redis容器 它在本地运行良好 但部署到开发中时效果很好码头工人群集群 我无法登录 Symfony 应用程序
  • 从 .NET 应用程序登录 Windows

    我认为它应该是一个Windows服务 当给定某些条件时 它应该执行登录到机器的操作 机器将在 登录屏幕 中检查网络服务 以了解登录时应使用的用户名和密码 这可以吗 我不想要 自动登录 Windows 功能 Thanks AFAIK 无法完成
  • WCF 数据服务 (OData) 与 ASP.NET Web API

    我正在设计一个分布式应用程序 其中包含 RESTful 服务和各种客户端 Silverlight iOS Windows Phone 7 等 现在 我正在确定应该使用哪种技术来实现我的服务 WCF 数据服务 OData 或随 ASP NET
  • 对 Bitstamp 进行身份验证的 Java Jersey REST 调用

    我正在尝试对 Bitstamp 进行私人 REST 调用 请参阅https www bitstamp net api https www bitstamp net api 但是 我收到以下回复 错误 缺少密钥 签名和随机数参数 他们在 AP
  • 我可以在 iPhone 应用程序上使用 Facebook 身份验证服务器端流程并仍然进行客户端交互吗?

    我有一个使用 Facebook 身份验证来登录用户的网站 它使用 oAuth 2 0 服务器端流程进行身份验证 一切正常 我现在正在为同一网站开发一个 iPhone 应用程序 并希望允许用户使用 FB 身份验证通过 iPhone 应用程序登
  • ASIHTTPRequest 登录页面

    我尝试制作一个 iPhone 应用程序 可以登录到使用 https 保护用户信息的 Web 应用程序 现在我陷入了登录页面 我不知道通过我的应用程序登录时如何检查用户网站中的真实帐户 即使我输入错误的帐户 我也只收到 200 的回复 这是我
  • 对 momentapp 的 Restful api 进行 RestSharp 请求

    所以我尝试根据文档设置 RestSharp 以使用 Moment Task 调度http momentapp com docs http momentapp com docs 这是我的代码 public class MomentApi IT
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar

随机推荐

  • 编译并运行C++代码运行时

    有谁知道如何在程序运行时编译您编写的 C 代码 后来我想运行该代码 我想这样做是因为我正在尝试制作一款可以教您编程的游戏 因此用户必须在游戏运行时编写代码并进行测试 谢谢你的帮助 如果您选择一种在设计时考虑到嵌入的语言 例如 LUA 或 p
  • 如何在 Prolog 中将谓词作为另一个谓词的参数传递?

    我有这 3 个谓词 times X Y Result is X Y minus X Y Result is X Y plus X Y Result is X Y 例如我想通过times 2 2 in the plus X Y 像这样plus
  • JVM 是开源代码吗?

    JVM 是开源代码吗 如果没有 如何获取JVM的代码 这完全取决于您使用哪个 JVM 如果您使用 OpenJDK JVM 那么您可以从以下位置获取源代码here or here来自 OpenJDK 项目列表 或者here来自 GitHub
  • 无法连接到SQL Server 2008?

    我一直在尝试各种技巧 从启用 TCP IP 向防火墙添加例外到戳比尔盖茨巫毒娃娃 但似乎没有什么对我有用 通过management studio连接到sql server 2008真的那么难吗 也许 抢劫银行会更容易 当我弄清楚要抢劫哪家银
  • RSA 加密的结果是否保证是随机的

    我使用 RSACryptoServiceProvider 来加密一些小数据块 对于我正在研究的解决方案 重要的是 如果使用相同的公钥对同一段源数据加密两次 则结果 加密的数据块 不相同 我已经用一个例子对此进行了检查 它的效果正如我所希望的
  • 获取发件人电子邮件地址

    我有以下 VBA 代码 用于在收到特定主题时自动发送电子邮件 Private WithEvents Items As Outlook Items Private Sub Application Startup Dim objNS As Ou
  • 我们如何按类指定 jQuery 验证插件的规则?

    The jQuery 验证插件效果很好并且非常容易使用 selector validate 只需设置 CSS 类 如 必需的电子邮件 就会显示默认消息 但是 我需要自定义消息 该文档说您可以使用元素的键值对及其相应的消息来指定规则 sele
  • 如何在 Pygame 中使用 Sprite Collide

    我正在制作一个非常简单的游戏 小鸟 玩家 必须躲避岩石 如果它被岩石击中 你就会失败 我正在尝试使用 pygame sprite collide rect 来判断它们是否接触 但我似乎不知道如何正确使用它 这是我的代码 import pyg
  • Android - 创建进度对话框

    我是安卓开发新手 我想开发一个dialog with a progressbar在我的应用程序中 当我点击搜索按钮时dialog应与出现progressbar 显示在切换到另一个之前进度正在进行中activity 请用示例代码建议我 Use
  • 使用 Visual Studio 2008 编译 php 扩展,MODULE ID 与 php 不匹配

    使用 VC9 2008 和 VC10 2010 编译我自己的 php 扩展后 使用以下步骤 http blog slickedit com 2007 09 creating a php 5 extension with visual c 2
  • 使用低级键盘钩子更改键盘字符

    我正在创建自定义键盘布局 作为开始步骤 我想让用户按下一个键 让我的键盘钩子拦截它 并输出我选择的不同键 我找到了这个键盘挂钩代码 我试图根据我的目的对其进行稍微修改 http blogs msdn com toub archive 200
  • 在进程中断期间使用 python ctypes 时高延迟背后的原因

    在调查 Python 代码库中的关键路径时 我们发现 ctypes 在延迟方面的行为是相当不可预测的 我们的应用程序的更多背景 我们有很多进程 每个进程都通过共享内存进行通信 我们利用 python 库multiprocessing Raw
  • iPhone 如何通过无线或蓝牙访问另一台非 iPhone 设备?

    我试图弄清楚 iPhone 是否可以通过无线或蓝牙连接到另一台非 iPhone 设备 但发现了相互矛盾的信息 我发现的大部分内容都是在 SDK 3 0 版本发布之前发现的 当时这肯定是不可能的 查看堆栈溢出问题 例如iPhone 3 0 S
  • 将 HTTP 请求重定向到 HTTPS 的推荐方法

    我对如何将所有 http 页面重定向到 https 有一些疑问 我看到有人告诉我们要像这样重写reply 阿帕奇说要做this way 任何人都可以向我解释进行此更改的推荐方法是什么 将 http 重定向到 https 的唯一安全方法是使用
  • 如何调和独立的 head 和 origin/master?已经检查了旧的哈希值

    介绍和搜索 所以我认为我犯了一个严重的错误 我很担心 我已经解析了论坛中的独立负责人 我已经接近找到答案 但场景太具体 不适用于我所在的地方 如果您找到可以回答我的问题的特定主题 请链接我 例如 如何使分离的 HEAD 与 master o
  • 如何在knitr R代码块中间插入markdown?

    例如 我想在以下代码块中的两个图之间插入一个中断 而不将其分解 r plot 1 100 1 100 plot 1 100 1 100 这样的结果是这样的 r plot 1 100 1 100 br r plot 1 100 1 100 I
  • switch(enum) 后“缺少返回语句” - 为什么?

    编译器声称末尾缺少 return 语句MyClass parse 这是代码 package de hs rm safelyovertaken ble import android support annotation NonNull imp
  • 如何使用 SA_OAuthTwitterEngine 在没有 PIN 的情况下从 iPhone 发布推文?

    我正在开发一个 iPhone 应用程序 它将推文发送到 Twitter 为此 我使用 SA OAuthTwitterEngine MGTwitterEngine 类 我将应用程序注册到 www twitter com apps 并传递消费者
  • 注意:尝试获取非对象的属性

    我正在学习一些 PHP 它应该打印 0 但是我收到错误 注意 尝试获取非对象的属性 JSON 字符串外部的括号使其成为数组内部的对象 您可以通过指定所需的数组成员来访问该对象 obj 0 gt qty 或者更改您的 json 字符串 以便它
  • 基于 REST API 令牌的身份验证

    我正在开发一个需要身份验证的 REST API 由于身份验证本身是通过 HTTP 上的外部 Web 服务进行的 因此我推断我们将分配令牌以避免重复调用身份验证服务 这让我想到了我的第一个问题 这真的比要求客户端在每个请求上使用 HTTP 基