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

REST API令牌身份验证

梁修贤
2023-03-14

我刚刚开始在.NET中开发我的第一个REST API。由于它将是无状态的,我将使用令牌进行身份验证:

基本思想(System.Security.Cryptography):

    null
  • 检查凭据是否有效(用户名,将哈希密码与db值进行比较)
  • 如果为真,则加密数据对象
  • 对生成的令牌使用HMAC,并将其存储到数据库
  • 将令牌(不带HMAC)返回给用户(cookie/字符串)

对需要身份验证的方法的请求:

  • 用户随每个请求发送令牌
  • 令牌已解密
  • 如果过期,错误
  • 如果未过期,则使用HMAC并将用户名+生成的哈希值与db值进行比较
  • 如果db检查有效,则用户已通过身份验证

在我看来,这种方法有以下优点:

  • 即使db被压缩,它也不包含实际的令牌(哈希无法反转...)
  • 即使攻击者拥有令牌,也不能通过更新字段来增加过期时间,因为过期日期在令牌本身

首先,我想知道这是否是一个好的方法。

更新:

好的,现在我做了一些更多的研究,得出了这样的解决方案:

  • 令牌将包含最初指定的数据(用户名、发布日期和超时)
  • 令牌由encrypt-then-mac生成(它包括AES加密数据、IV矢量+这2个用于身份验证的值的标记,由HMACSHA265生成)
  • 令牌标记将写入DB
  • 用户将在以下情况下进行身份验证:
    • 标记有效(令牌身份验证)
    • 可以解密数据
    • 令牌尚未过期
    • 标记与数据库中写入的标记匹配
    • 用户在数据库中未被阻止(请求时令牌无效)
      null

共有1个答案

宋劲
2023-03-14

这是问题下的评论线程的后续。

您似乎对OAuth到底是什么有点困惑,所以希望我能在这里澄清一下。

OAuth不是web服务或您使用的东西。它是一种协议,描述站点根据服务对用户进行身份验证的方式,而不允许站点知道用户的凭据是什么。作为一个附带的好处,大多数OAuth提供者还有一个web服务来查询用户的信息,并且可以同时授予这样做的权限。

例如,假设您有一个web服务,允许第三方站点为用户提供Acme品牌的小部件。您的第一个第三方实现者是流行的MyBook.org。流程看起来如下所示:

>

  • 有人邀请用户在他们的MyBook配置文件中使用“Acme Widgets”应用程序。
  • 用户单击该按钮,该按钮将重定向到acmewidgets.com。URL看起来如下所示:

    http://acmewidgets.com/oauth/user?r=http%3a%2f%2fmybook.org%2foAuth%2fclient&appid=12345

    服务器端的MyBook现在接受该令牌,并将一个web服务调用返回到AcmeWidgets:

    http://acmewidgets.com/oauth/validate?token=abcdefg&appid=12345&appsecret=67890

    MyBook使用该令牌后,现在可以调用AcmeWidgets API:

    http://acmewidgets.com/api/provision?appid=12345&token=abc123&type=etc

    这就是众所周知的OAuth舞蹈。注意,这里有许多实现定义的东西,如URL、对各种令牌进行编码的方法、令牌是否可以过期或被撤销等。

    希望这能为你澄清一切!

  •  类似资料:
    • 我有一个LaravelAPI(实际上是LumenAPI)服务于VueJS前端。Vue应用程序允许用户登录到谷歌。然后将Google令牌发送回Lumen API,后者使用Google验证令牌,然后验证电子邮件地址是否为有效用户。然后它生成一个令牌,与用户一起存储在数据库中,并返回用户对象。 我没有使用Passport或jwt auth之类的东西。那么现在,我如何使用默认的Auth中间件来验证(现在已

    • 我正在尝试在Dropwizard web应用程序中实现OAuth2身份验证。我已经创建了所需的<code>验证器 我所需的行为是,在我的客户端通过在我的登录页面上提供他/她的凭据登录后,我想将客户端重定向到我使用Dropwizard Views创建的问候语页面,并且路径为“/me”,如下所示: 我的问候资源如下所示: 目前,我得到一个“访问此资源需要凭据。”登录后的响应。在阅读了一些关于令牌认证的

    • 在传统的基于cookie/JSESSION的身份验证的同时,是否可以使用基于令牌的(无状态)身份验证? 应用程序已经有一个现有的Spring MVC+Thymeleaf实现,用作管理/超级用户门户。当你登录时,你会得到一个JessionID。我们需要使用Jersey(JAX-RS)创建一个RESTful API以供客户端使用。要求是无状态的。本质上,我们仍然需要Spring MVC+Thymele

    • 我有一个REST Jersey web服务。 php中基于令牌的身份验证 它在答复中提到; “然后它发送此令牌和请求的某些特征的哈希来验证请求,例如sha1(令牌+时间戳+请求URL+请求正文)。您的服务器可以对此进行验证,而客户端不必在每个请求上以纯文本发送令牌。” 另一个问题是,一旦服务器接收到这个令牌的哈希值(包括时间戳和用户ID等),服务器如何在没有存储令牌的查找表或数据库的情况下从这个令

    • null 我的自定义rest筛选器: 上面的内容实际上会导致应用程序启动时出现一个错误:有人能告诉我如何最好地执行此操作吗?pre_auth筛选器是执行此操作的最好方法吗? 编辑 使用Spring-security实现解决方案 希望它能帮助其他人…