REST服务上的身份验证令牌有什么意义

Spr*_*ing 15 java authentication rest

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

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

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

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

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

Eug*_*sky 10

这实际上取决于场景 - 在不了解更多关于API的情况下很难分辨 - 但"身份验证令牌"的使用远非普遍,许多API不需要(也不使用)它们是正确的.许多API只需要随每个请求一起发送API密钥(通常通过HTTPS来阻止它被截获),或者需要API密钥来识别用户以及带有"密钥"的数字签名来证明用户的身份(参见使用大多数API时,为什么它们需要两种类型的身份验证,即密钥和密钥?).

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

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

另外:正如上面的用户"Dan"所指出的那样,在设计一个需要在每个请求中发送用户名/密码的API时(或者真的有任何请求,即使它只是登录请求),请注意如何操作.如果您正在使用默认情况下支持浏览器的技术(例如HTTP Basic Auth),那么您将无法安全地将API公开给跨域用户(即,很可能您的API永远不能直接从浏览器安全地调用,即来自AJAX/Flash/Silverlight代码).

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