【问题标题】:What is the point of Authentication tokens on REST servicesREST 服务上的身份验证令牌有什么意义
【发布时间】:2012-12-22 13:44:50
【问题描述】:

在每次发出请求时使用 REST Web 服务而不是通过 HTTPS/加密发送用户名和密码时,使用身份验证令牌有什么价值?

我知道,例如 OAUTH 有一些好处,因为您不需要将密码泄露给第 3 方,您可以将令牌传递给您不想共享用户名/密码的受信任的第 3 方..etc

但除了上述我当然不需要的特殊好处之外,我为什么要使用令牌而不是每次都发送用户名/密码。

这可能是为了让客户的生活更轻松,并且不必每次都发送用户名/密码。好吧,但是现在客户必须记住我的令牌并在每次请求时向我发送令牌。因此,现在它不会记住/发送用户名/密码,而是对令牌做同样的事情!所以客户端实现代码不会少。

那么这里的真正价值是什么?

【问题讨论】:

    标签: java rest authentication


    【解决方案1】:

    这真的取决于场景 - 如果不了解更多关于 API 的信息很难判断 - 但是“身份验证令牌”的使用远非普遍,你说得对,许多 API 不需要(并且不要使用) 他们。许多 API 只需要在每个请求中发送一个 API 密钥(通常通过 HTTPS 以防止其被拦截),或者需要一个 API 密钥来识别用户,还需要一个带有“密钥”的数字签名来证明用户的身份(见When working with most APIs, why do they require two types of authentication, namely a key and a secret?)。

    公共 API 中不经常使用用户名/密码,因为它们不够灵活,并且不能在用户身份和应用程序身份之间提供足够的“分离”。例如。您注册为开发人员以使用 Flickr API 并创建一个使用该 API 的 iPhone 应用程序 - 您真的希望将您的开发人员用户名/密码内置到应用程序中吗?如果您稍后更改密码怎么办?如果您想开发 5 个应用程序并分别跟踪它们的使用情况并能够随时关闭任何应用程序而不影响其他应用程序怎么办?

    但是,对于您真正只想识别人类用户而不是应用程序的情况(例如,只为您自己的应用程序提供服务的私有 API 后端,而不是公共 API),在大多数情况下我不看到您的建议有任何问题,即每个请求都使用 HTTPS 上的用户名/密码。哦,顺便说一句,auth 令牌具有“可限制”的额外优势(可以在特定时间过期,可以仅限于某些操作等),但显然这仅在非常特定的场景中有用。

    另外:正如上面用户“Dan”所指出的,在设计一个需要在每个请求(或任何请求,即使它只是登录请求)中发送用户名/密码的 API 时,要小心你是如何做到的.如果您使用的是浏览器默认支持的技术(例如 HTTP Basic Auth),那么您将阻止自己将 API 安全地暴露给跨域用户(即很可能永远无法从浏览器直接安全地调用您的 API ,即来自 AJAX / Flash / Silverlight 代码)。

    这是一个复杂的话题,在这里无法完全解释,但请记住,如果您的 API 依赖于浏览器可以记住的任何安全凭证,然后“静默”地注入每个请求(例如 HTTP Basic Auth、 cookie),那么使用任何跨域技术(CORS、JSONP、crossdomain.xml 等)启用对该 API 的跨域访问是不安全的。

    【讨论】:

    • 所有很棒的信息,但我很困惑;1- 我应该如何将用户名密码发送到我的 REST jersey 服务,我打算发送 HTTP 标头。 2-您能否解释一下“那么使用任何跨域技术启用对该 API 的跨域访问是不安全的”是什么意思?我完全不知道这可能意味着什么:)
    • 再次,这完全取决于场景。它是供许多开发人员使用的公共 API,还是仅为您自己的应用程序提供后端的私有 API?您是否尝试使用 API 或人类最终用户对应用程序进行身份验证?我在第 2 段中所说的一切(关于跨域访问)仅在它是公共 API 并且您希望人们能够从浏览器访问它(即从 AJAX 代码、从 Flash 或银光)。在所有其他情况下,您可以忽略这些内容。
    • tnx 这里解释了我的应用程序; stackoverflow.com/questions/13997040/…
    • 此外,与安全随机生成的令牌相比,用户的密码通常更容易受到暴力破解或字典攻击。
    【解决方案2】:

    我能回答这个问题的最佳方法是指向描述 REST 安全性的 this 页面。它属于 restlet wiki,不属于 Jersey,但它可以应用于 Jersey,因为它们都是 REST 实现。

    这是从我提供的链接中提取的:

    “为了最大的抵抗力,服务器可以向客户端提供应用程序级授权令牌,服务器可以验证的不透明值属于正确的经过身份验证的用户。

    • 这样的代币对于第三方来说应该是难以计算的,例如用户身份凭证的服务器加盐 MD5 或 SHA1 哈希。

    • 要击败 XSRF,需要通过用户代理不会随每个请求自动返回的方式传输此应用程序级令牌。例如,它可以在表单的 HTML 中作为隐藏字段发送,并在编码的表单实体中通过 POST 返回。”

    【讨论】:

    • 但是第 3 方始终可以访问“/login”Rest 方法,如果他们猜到用户名/密码,他们仍然可以从服务器“获取”令牌?
    • 您能否解释一下“用户代理不会随每个请求自动返回”是什么意思?所以如果我的方法是“GET”,我不会在请求标头中将其发回?
    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多