创建一个 TOKEN 系统来验证 Web 服务调用的最佳方法是啥?

Posted

技术标签:

【中文标题】创建一个 TOKEN 系统来验证 Web 服务调用的最佳方法是啥?【英文标题】:Best way to create a TOKEN system to authenticate web service calls?创建一个 TOKEN 系统来验证 Web 服务调用的最佳方法是什么? 【发布时间】:2010-11-28 19:03:14 【问题描述】:

我想创建一个可以被各种平台调用的 Web 服务架构,例如移动设备、winforms 应用程序、iphone、黑莓,应有尽有。因此,使用 WCF 和 wsHttp 绑定之类的东西可能会杀死这一点,我需要降级到 basicHttp 绑定以实现兼容性。

话虽如此,我需要一个系统在初始登录(身份验证)时生成一个令牌,然后将此令牌用于所有后续调用,我猜,以验证身份验证并允许执行该方法。

有人对如何解决这个问题有提示或建议吗? 1) 生成令牌以及安全令牌涉及什么? 2) 令牌可以使用多长时间,一些用户可能会使用他们的应用程序几个小时,甚至可能“休眠”他们的计算机

感谢您的建议。

【问题讨论】:

我的问题更多是关于在所有调用中来回传输此令牌的最佳方式是什么,而不是关于如何进行身份验证。一旦服务器生成此令牌(序列化类),将其附加到所有后续调用的最佳方式是什么?作为方法的参数,或者它可以作为标题或其他东西附加,因此它对所有方法(服务合同)都是透明的 【参考方案1】:

如果您只使用服务器在初始身份验证时提供的一个令牌,则它可以用于任何请求(如果它被拦截)。您唯一的防御措施是到期时间。

除此之外,这取决于您的实施选项。

更安全的系统是为每个请求添加一个时间戳(也可能是一个随机数),对其进行签名,并将其包含在每个请求中。它要求客户端处理身份验证凭据,了解签名实现并对每个请求进行签名。

您可以交替地让服务器对每个请求进行身份验证(可以使用 OpenID 完成),或者分发一些令牌并在需要更多令牌时重新进行身份验证(可以使用 OAuth 完成)。如果客户端可以存储凭据,则这些对用户来说是不可见的。这些更复杂,需要加密传输(例如 SSL)用于某些交互,以及可以说出 HTTP 重定向并处理 cookie 或其他存储状态的客户端。客户端不必知道如何签名,但如果您可以使用 SSL,您可能一开始就不需要复杂性。

如果您不需要与客户端无关,您可能想要签署请求。

对于签署实施、示例和库,请查看 Amazon Web Services、OpenID 或 OAuth。

关于令牌到期时间,这取决于您的需求。更长的令牌寿命会增加窗口重放攻击。 nonce 使令牌一次性使用,但需要服务器上的更多状态。

【讨论】:

【参考方案2】:

您应该查看OAuth。它是 API 身份验证的标准,您可能只需将现有实现插入到您的服务中。

【讨论】:

OAuth 协议允许您根据自己的喜好设置参数。我建议你看看一些服务提供商,看看他们用 OAuth 做了什么。 wiki.oauth.net/ServiceProviders

以上是关于创建一个 TOKEN 系统来验证 Web 服务调用的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Net WebApi一个简单的Token验证

Spring Cloud中Feign如何统一设置验证token

Spring Cloud中Feign如何统一设置验证token

Salesforce 小知识:使用 JSON web token 调用 REST 函数

json web based token在服务器端的验证流程

JWTJSON Web Token 简述