我想在我的 PHP 服务器上实现 OAuth 服务器,它有一个 SSL 连接。PHP-codeigniter 还没有像样的 OAuth 2 框架。那么我应该使用哪一个 OAuth1 或 OAuth2 ?
3 回答
简短的回答是:您应该考虑使用 OAuth 1.0a [1] 而不是 OAuth 2.0
长答案如下:
默认情况下,OAuth 2.0 需要使用 SSL/TLS 来确保传输层安全。因此,在实施符合 OAuth 2.0 的授权服务器时,您需要允许客户端应用程序通过安全通道连接到授权端点和令牌端点。请参阅 OAuth 2.0 规范 [2] 中的以下部分:
3.1(授权端点)
“[...] 向授权端点发送请求时,授权服务器必须要求使用第 1.6 节所述的 TLS。”
3.2(令牌端点)
“[...] 向令牌端点发送请求时,授权服务器必须要求使用第 1.6 节中所述的 TLS。”
在您的情况下,当您没有 SSL 连接时,您仍然可以考虑使用 OAuth 2.0 和 MAC 访问身份验证 [3],它指定如何通过发出 MAC 类型的访问令牌来发出 OAuth 2.0 请求。此类令牌使用共享对称密钥进行加密签名(密钥在客户端应用程序和服务器之间共享)。
重要提示:但是,在这样的设置中,您仍然需要为客户端提供一种机制,以便能够以安全的方式与您的 OAuth 2.0 服务器建立共享密钥(如何完成取决于您 - 可以通过一些SSL 通道或带外,具体取决于您的具体用例)。这是允许客户端安全访问受保护资源的严格要求!
“MAC 方案需要在客户端和服务器之间建立共享对称密钥。该规范提供了一种这样的方法,用于使用 OAuth 2.0 以 MAC 类型访问令牌的形式向客户端颁发一组 MAC 凭据。
该机制的主要设计目标是简化和改进不愿意或无法对每个请求使用 TLS 的服务的 HTTP 身份验证。特别是,此机制利用初始 TLS 设置阶段在客户端和服务器之间建立共享机密。然后通过不安全的通道使用共享秘密来提供针对被动网络攻击者的保护。”
基于上述解释,我会考虑使用 OAuth 1.0a [3],它不需要使用传输级安全性来进行客户端和授权服务器之间的通信(OAuth 1.0a 使用术语“服务提供者”,顺便说一句)。相反,它依赖于使用共享对称密钥(或 RSA 密钥)对消息进行签名。然而。请注意,除非您使用 HMAC-SHA1 或 RSA-SHA1 签名(即您决定使用 PlAINTEXT 签名类型),否则无论如何您都需要使用 SSL/TLS。
[1] https://www.rfc-editor.org/rfc/rfc5849
[2] https://www.rfc-editor.org/rfc/rfc6749
[3] https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-http-mac-01
从客户的角度来看,OAuth 2 更容易集成到应用程序中,还有其他好处:OAuth 2 与 OAuth 1 有何不同?
只需将任何外部 Oauth2 库与 Codeigniter 集成。这是一个:https ://github.com/bshaffer/oauth2-server-php
我使用 OAuth2 已经 2 年了,我强烈推荐使用它,因为它非常可靠。关于 SSL,据我所知,OAuth 应该利用 SSL 来获得正确的实现,避免这种情况根本不会采用 OAuth 协议。