REST服务身份验证令牌的要点

问题描述:

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

我明白,例如OAUTH有一些好处,因为您不需要将密码泄露给第三方,您可以将令牌传递给您不想共享用户名/密码的可信第三方。

但除了这个特殊的好处,我当然不需要在我的情况下,为什么我会使用令牌,而不是每次发送用户名/密码。

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

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

这真的取决于具体的方案 - 这很难说,不知道多关于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令牌具有“可限制”(可以在特定时间到期,仅限于某些动作等)的额外优势,但显然这只在非常特定的情况下才有用。

另外:正如用户“丹”在上面指出的那样,当设计一个需要发送每个请求的用户名/密码的API时(或者真的有任何请求,即使它只是登录请求),小心你的做法它。如果您使用的是浏览器默认支持的技术(例如HTTP基本身份验证),那么您可以防止自己将API安全地暴露给跨域用户(即很可能无法直接从浏览器安全地调用API ,即从AJAX/Flash/Silverlight代码)。

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

+0

所有优秀的信息,但我很困惑; 1-我应该如何发送用户名密码到我的REST球衣服务,我打算发送HTTP头。 2-你能解释一下你的意思吗?那么使用任何跨域技术来跨域访问该API是不安全的。“我不知道这可能意味着什么:) – Spring

+0

同样,这一切都取决于场景。它是许多开发人员的公共API还是专门为您自己的应用程序提供后端的私人API?您是否尝试使用API​​或人类最终用户来验证应用程序?我在第二段中提到的关于跨域访问的所有内容只有在公共API *和*希望人们能够从浏览器(即从AJAX代码,从Flash或Silverlight)访问它时才是重要的。在其他所有情况下,您可以忽略这些内容。 –

+0

tnx在这里我的应用程序被解释; http://stackoverflow.com/questions/13997040/jersey-request-for-authentication – Spring

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

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

“对于大多数阻力,服务器可以与应用程序级授权令牌存在于客户机,一个不透明的值,该服务器可以验证属于权利认证的用户。

  • 这样的令牌应该是困难的第三方来计算,用户的身份凭证例如服务器腌MD5或SHA1哈希。

  • 为了击败XSRF,THI应用程序级令牌需要通过用户代理不会自动返回每个请求来传输。例如,它可以是这样的形式作为隐藏字段的HTML的编码形式实体发送,并返回通过POST“

+1

但第三方总是可以访问“/ login”Rest方法,如果他们猜测用户名/密码,他们仍然可以从服务器“获取”令牌? – Spring

+0

也可以解释你的意思是“用户代理不会自动返回每个请求”所以如果我的方法是“GET”,我不会将它发回请求头? – Spring

+0

我更新了我的答案。 –