2013-07-02 49 views
0

我正在写一些代码来获取Twitter和Instagram的饲料。在我编写任何代码之前,我一直希望对oAuth有一个很好的理解,因为我有这种唠叨的感觉,它并不是那么安全,而且大多数时候,比如在访问公共推文时,这是一种不必要的无用函数。我开始阅读oAuth 2 specification以获得更好的理解,我仍然处于中间。我有很多问题。OAuth - 它如何安全?

让我们以Twitter为例。 用户访问您的网站。您将它们重定向到Twitter以进行身份​​验证并获取authorization_grant代码。 我知道这部分是安全的,因为用户身份验证和重定向到您的网站将通过SSL发生。 Twitter是否足以支持SSL,或者您的网站是否也必须支持SSL才能使重定向安全?您不希望授权代码不安全地传输,对吧?

既然您有了授权授权代码,您的网站就会向Twitter发送请求以获取访问令牌。当提出此请求时,您的网站将发送authorization_grant代码,您的客户端ID和客户端密钥。我再次猜测通信是安全的,因为这将发生在ssl上。但是如果网站在其HTML或Javascript中包含了客户端ID和密码,特别是如果它是一个没有服务器端代码的静态网站呢? 重定向url是否应该始终由服务器端代码处理,并且服务器端代码应该使访问令牌的请求不经过HTML或Javascript?

一旦你有了访问令牌,你就会将它包含在你的请求中,以获得用户的推文,代表他们发布推文等。同样,如果有问题的网站要将访问令牌包含在HTML或JavaScript中与客户端ID和秘密,这将是非常不安全的,对吧?

oAuth的所有安全性似乎源于ssl和客户端保留其客户机密的能力。这个结论我是否正确?

另一件事 - 在流程的第一步中,当客户端将用户重定向到Twitter以认证并获取authorization_grant代码时,他们可以发送他们的客户端ID和密码,直接获取访问令牌,而不是直接第二次请求它。我认为这是他们在规范中隐含的方法所表达的含义。 那么,为什么在规范中添加第二个获取访问令牌的请求呢?它增加了安全性吗?

回答

1

我不知道Twitter的API,我对于谈话stackexchange API https://api.stackexchange.com/docs/authentication

我又猜通信是安全的,因为这会发生 通过SSL。但是如果该网站在其HTML或Javascript中包含了客户端ID和秘密 ,特别是如果它是一个静态网站 而没有服务器端代码呢?

client_secret仅在明确流动的情况下发送。显式流应由服务器端应用程序使用,并应小心保持client_secret的安全。

那么,为什么发送第二个请求获得 访问令牌的额外步骤?

好,流量比明确流的安全性较低,因为访问托克被发送到用户代理。但是在隐式流的情况下会有一个属性到期,除非您已指定范围否表达式,否则将会过期。同时服务器端的流量可以由被registerd

的应用程序只用它看起来的OAuth的所有安全与SSL和客户端的 保持自己的客户端秘密的秘密的能力造成的。我在这 的结论是正确的吗?

再次client_secret将在服务器端流程中可用。但是,是的,客户端应该注意access_token没有给出

看看这个link。它给出了行为中的一个可能的漏洞的例子。