原文:https://community.apigee.com/questions/21139/jwt-vs-oauth.html
这个问题很常见,但不太合适进行比较。 JWT是一种令牌,OAuth是一个描述如何分配令牌的框架。 JWT绝对可以用作OAuth承载令牌。 实际上,这是最常见的做法。 他们之间的比较有点类似苹果和苹果推车的比较。
通常人们总是认为“OAuth令牌”是由OAuth令牌服务器颁发的不透明令牌,然后只能由同一个OAuth服务器验证。 但不是只有一类OAuth令牌。 JWT也是一种不同的OAuth令牌。
今天, the OAuthV2/GenerateAccessToken 策略 在Apigee Edge 生成不透明令牌. 他返回一个32字节的无意义随机字符串,令牌拥有者并不清楚这个令牌的含义,因此我们称之为“不透明”。 要使用令牌,持有者必须将其提交给令牌颁发者,因为原始的令牌颁发者是唯一可以将不透明的令牌与有意义的信息相关联的一方。 您可以将不透明令牌视为一个指针,其指向仅由令牌颁发者持有的信息。
相比之下,JWT并非不透明。他既不是某些信息的“指针”,也不是它的应用。它本身就包含许多信息,任何具有令牌的一方都可以从中提取和解释。 因为JWT包含真实信息,所以JWT可能很大; 能达到300字节或更多,具体取决于其中包含的声明内容。 当人们说“JWT是具有自我验证”的时候,其意味着JWT的任何持有者都可以打开它、验证它,然后根据其中提取出的声明做出授权决定。 验证JWT意味着:验证其结构,解码base64编码,验证密钥是否正确,验证签名,然后验证令牌中是否存在所需的声明,检查到期时间。 这不是一件简单的事情,而是一个多步骤的过程,但重点是,任何持有人理论上都可以使用令牌。 因此,我们说JWT支持“Federation” - 任何人都可以生成令牌,任何人都可以读取和验证令牌。
什么情况下使用非透明令牌或者JWT的场景?
当满足下列条件时最好使用JWT:
- 需要Federation; 例如,您希望将Azure AD用作令牌颁发者,然后使用Apigee Edge作为令牌验证程序。 使用JWT,应用程序可以向Azure AD进行身份验证,接收令牌,然后将该令牌呈现给Apigee Edge进行验证。 (与Google登录相同,或Paypal,或Salesforce.com等)
- 异步是必需的;例如,客户端发送了请求,然后将该请求存储在某个位置,以便“稍后”由其它单独的系统执行操作。 该单独的系统不具有与客户端的同步连接,并且它可能没有与中央令牌颁发者的直接连接。 异步处理系统可以读取JWT以确定工作项是否可以并且应该在以后的时间完成。 在某种程度上,这与上面的Federation理念有关。 但请注意:JWT到期, 如果持有工作项的队列未在JWT的生命周期内得到处理,则其不再受到信任。
而当满足以下条件时最好使用非透明令牌机制:
- 没有联邦。 令牌的颁发者是验证令牌的同一方。 带有令牌的所有API请求都将通过令牌颁发者。
- 不需要或不希望允许令牌的持有者检查令牌内容。
- 当您希望单方面允许令牌撤销时: 撤销JWT是不可能的, 它们在创建时就已经标记了过期的时间。