如何对单个Skydrive帐户进行身份验证,而不要求用户提供凭据


How do you authenticate to a single Skydrive account and not ask the user for credentials?

我有一个客户端希望将SkyDrive用作网站的云存储。此网站不会要求网站用户的SkyDrive帐户向他们显示文件,而是网站所有者将在SkyDrive中存储一些文件,并希望与登录到其网站的用户共享这些文件。我的问题是,如何从网站的后端PHP代码直接向SkyDrive API发送凭据?

关于Live Connect的API文档(http://msdn.microsoft.com/en-us/library/live/hh243647.aspx)似乎专注于向用户提供一个登录表单,以将用户的凭据发送到服务。再说一遍,那不是我想要的。该网站的用户不必做任何事情,只需转到该页面,他们就会看到从SkyDrive帐户镜像的文件。凭据应存储在服务器上,并在用户请求页面时发送。

我问了一个关于谷歌文档的类似问题(我如何在没有oAuth身份验证的情况下连接到谷歌日历API?)。这个问题的答案是设置一个临时脚本来获得一个刷新令牌,该令牌可以反复用于身份验证。我试过了,它确实奏效了。然而,我不确定刷新令牌能持续多久,也不确定同样的方法是否适用于SkyDrive API。

编辑:在做了更多的研究之后,Live Connect文档(http://msdn.microsoft.com/en-us/library/live/hh826540)比如:

在用户同意后,Live Connect会为您的应用程序提供一个特殊的代码或访问令牌,使您的应用能够处理他或她同意的用户信息部分。通常,此访问令牌的有效期约为一小时。这个小时结束后,你的应用程序将无法再处理用户的信息——它必须要求用户再次通过登录和同意流程。要解决此问题,可以要求用户同意wl.offline_access作用域。这为你的应用程序提供了一个额外的代码,称为刷新令牌,你的应用可以在需要时使用它来获得新的访问令牌——即使在用户注销之后——通常长达一年。但是,用户可以随时撤销您的应用程序的访问权限。如果用户选择撤销对您的应用程序的同意,则相应的访问令牌或刷新令牌将不起作用——您的应用必须要求用户再次通过登录和同意流程。

因此,看起来刷新令牌可以持续一年。这意味着我可以装配一些东西来获得刷新令牌,存储它,然后在每个页面请求中,使用刷新令牌来获得访问令牌并显示数据。然而,我必须每年更新一次该客户端的刷新令牌并将其存储。这听起来正确吗?这是最好的方法吗?

OAuth 2有一个专门的流,称为客户端凭据授予。

谷歌已经通过服务帐户客户端证书实现了这一点,正如在回答您的另一个问题时提到的那样。

然而,到目前为止,微软还没有实现该流程,因此目前最好的方法是使用您已经在谷歌文档中使用的变通方法。