会话管理:如何为 REST 服务生成身份验证令牌? (球衣)

Posted

技术标签:

【中文标题】会话管理:如何为 REST 服务生成身份验证令牌? (球衣)【英文标题】:Session management : How to generate Authentication token for REST service ? (Jersey) 【发布时间】:2011-06-25 19:10:23 【问题描述】:

我正在尝试在我的 REST 服务中实现会话管理。我在冲浪时了解了这些准则:

    不使用服务器端会话 - 它违反了 RESTful 原则。

    使用 HTTP 基本身份验证 - 现在不可能,因为我被要求不要使用 SSL/TLS(这无疑是基本身份验证所需要的。)

    使用 Http 摘要 - 我听说这会增加网络流量。这听起来很昂贵,尤其是当我的客户是移动设备时。

    使用 cookie - 我被告知我不应该依赖 cookie 来保护我的重要资源,它们很容易被欺骗。另外,我阅读了有关通过 cookie 进行跨站点脚本攻击的文章。

    我只能选择生成身份验证令牌,用户每次都必须发送 - 我承认这不是“完全”RESTful。

现在我需要知道,我应该如何生成这些在业务级别足够安全的唯一身份验证令牌?泽西岛有图书馆吗?我应该去 OAuth 吗?我刚刚阅读了一些关于它们的信息,它们对我有用吗?请记住,我的目标客户是移动设备——他们可以访问 OAuth 服务吗??

【问题讨论】:

【参考方案1】:

为简单起见,我使用UUID 生成自己的身份验证令牌,然后使用Jasypt 加密整个令牌:-

String key = UUID.randomUUID().toString().toUpperCase() +
        "|" + someImportantProjectToken +
        "|" + userName +
        "|" + creationDateTime;

StandardPBEStringEncryptor jasypt = new StandardPBEStringEncryptor();

...

// this is the authentication token user will send in order to use the web service
String authenticationToken = jasypt.encrypt(key);

密钥包含creationDateTime,以便我可以使用它来验证生存时间。这样,如果用户在 X 分钟后使用相同的身份验证令牌,它将不再起作用,我将发送回 403 禁止代码。

【讨论】:

谢谢 limc !同时,我查看了 Java 的 SecureRandom 类。它比你的方法更可取吗? 在我看来,两者都可以正常工作...附加creationDate 确实使令牌与UUIDSecureRandom 生成的密钥一起非常独特。重要的部分是 creationDate 供您检查 TTL。

以上是关于会话管理:如何为 REST 服务生成身份验证令牌? (球衣)的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架中的基于会话的与令牌身份验证

iPhone Webservice 身份验证和访问令牌

REST Web 服务身份验证令牌实现

使用 REST API 进行正确的会话管理

使用其他提供商身份验证服务(如 Soundcloud)时令牌身份验证的安全性?

管理身份验证令牌的最佳实践