OAuth还是JWT?该使用哪一个?为什么?

39

我正在学习基于令牌的身份验证,并尝试学习如何在Laravel 5中实现它。我遇到了两种非常流行的技术,但由于我对这些技术都很陌生,所以感到困惑。

Medium上的这篇文章建议我使用lucadegasperi/oauth2-server-laravel,根据Github上的星数和引用数量来看,我确信这是社区中非常受欢迎的软件包之一,可以帮助我进行OAuth实现。

Scotch.io上的另一篇文章则鼓励我使用tymondesigns/jwt-auth,同样根据Github上的星数来看,也非常受欢迎。

此时,我对该使用哪个选项感到犹豫不决,主要是因为我是新手开发者,没有使用过其中任何一个。

能否有人指出它们各自的优缺点,以及我应该使用哪一个?我的项目类型是否也会决定我应该使用哪种?如何操作呢?

此外,如果您认为我应该选择其中一个,请也指出好的资源,以帮助我开始使用它们。当然除了我提供的这两个链接之外。

3个回答

40

JWT是一个简单的认证协议,Oauth是一个认证框架。

经验丰富的开发人员需要大约一个月的时间才能完全理解和实现Oauth,而经验丰富的开发人员可以在阅读规范约一天后掌握JWT协议。因此,这基本上取决于您的具体用例。

如果您想要对API进行简单的无状态HTTP身份验证,则JWT就足够了,并且相对快速易于实现,即使对于新手开发人员也是如此。

以下是几个JWT资源:

还有一个Oauth资源:


1
谢谢你为我澄清这个问题。我很感激你清楚地说明了设置任何一个需要多少时间。我想我会坚持使用JWT。干杯。 :) - Rohan
3
OAuth是一个身份验证框架?实际上,它只处理授权,也就是控制对资源的访问。如果需要提供身份验证,还需要添加另一种机制。 - joedotnot
Oauth2是一种授权框架或协议。JWT也可用于授权或信息交换。 - Dusman
对于简单的API而言,作为授权令牌发放者和提供访问权限的API是否一致存在什么风险? - variable

20

JWT是JSON Web Token的缩写。正如名称所示,它是在两个方之间作为JSON传递安全数据的令牌。

另一方面,Oauth2是一组规则或通常称为框架的过程,有助于认证和授权两个方传输安全数据的过程。

以下图表将解释oauth2的工作原理:

Authorization Code flow

这里是图表中步骤的更详细说明:

  1. 应用程序请求用户授权访问服务资源
  2. 如果用户授权请求,应用程序会收到授权许可
  3. 应用程序通过展示自己的身份验证和授权许可请求授权服务器(API)发放访问令牌
  4. 如果应用程序身份得到验证并且授权许可有效,则授权服务器(API)向应用程序发出访问令牌。此时授权已经完成。
  5. 应用程序请求资源,并呈现访问令牌进行身份验证
  6. 如果访问令牌有效,则资源服务器(API)向应用程序提供资源

JWT和OAuth2完全不同,具有不同的用途,但它们是兼容的,可以一起用于传输安全数据。

在oauth2的第3步和第6步中使用JWT

基于评论更新。

我们可以单独使用Oauth和JWT。在Oauth2中,我们可以使用其他令牌机制而不是JWT。同样地,我们可以独立使用JWT通过使用私有密钥或公/私钥对其进行签名来保护我们的API。这样我们就可以在API之间传输身份验证声明。


1
这解释了技术,但没有回答具体的问题。 - eugenevd
2
JWT 和 OAuth2 是完全不同的并且服务于不同的目的,但它们是兼容的,可以一起使用,当然也是可以分开使用的。 - wonsuc

12
JSON Web Token (JWT)是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,以JSON对象形式安全地在各方之间传输信息。由于数字签名,此信息可验证和信任。JWT可以使用密钥(使用HMAC算法)或公钥/私钥对(使用RSA)进行签名。
OAuth 2.0是授权协议。OAuth 2.0取代了2006年创建的原始OAuth协议的工作。OAuth 2.0专注于客户端开发人员的简单性,同时为Web应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流。这个规范正在IETF OAuth WG中开发。
- OAuth有不同类型的令牌。
1) WS-Security令牌,特别是SAML令牌
2) JWT令牌
3) 旧版令牌
4) 自定义令牌
当比较JWT和OAuth2时,最重要的是要理解它们不相似,甚至是不兼容的。 JWT是一种认证协议,这意味着它是一组严格的指令,用于签发和验证已签名的访问令牌。这些令牌包含声明,应用程序可使用这些声明来限制对用户的访问。 OAuth2是一个授权框架,另一方面,OAuth2是一个框架,可以让用户和应用程序在私人和公共环境中授权特定权限给其他应用程序,类似于非常详细的指南。
一些有用的链接:
[1]: https://community.apigee.com/questions/21139/jwt-vs-oauth.html [2]: https://youtu.be/XGmUlyggXVo [3]: http://www.seedbox.com/en/blog/2015/06/05/oauth-2-vs-json-web-tokens-comment-securiser-un-api/

2
OAuth2 不是身份验证协议,而是授权协议/框架。 - Md Riadul Islam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接