在通用Windows应用程序中从Windows Live SDK接收刷新令牌

6
我正在开发一款通用的Windows应用程序(Windows 10),其中我有一个“双层”应用程序:在物联网设备上(例如Raspberry Pi 2)上,它只显示内容,但在所有其他设备上(PC、笔记本电脑、智能手机等),你可以得到类似于所显示数据的控制器。
我想要实现的功能之一是使用Windows Live登录控制器部分,以获取显示的IoT部分的日历信息。为此,我向用户提供了使用Windows Live登录的机会,如下所示:
LiveAuthClient auth = new LiveAuthClient();
LiveLoginResult loginResult = await auth.LoginAsync(new string[] { "wl.signin", "wl.calendars", "wl.offline_access" });
if (loginResult.Status == LiveConnectSessionStatus.Connected)
{
    //Save the AccessToken from loginResult.Session.AccessToken
    TokenHandler.Save(loginResult.Session.AccessToken); //AccessToken is quite accessable right here
    //But as far as I know I should save the RefreshToken, but the Session has no field for it
}

我的问题是,我无法从LiveConnectSession中获取可以存储RefreshToken的字段。但是所有我阅读过的文章都告诉我,只需要将wl.offline_access添加到范围中即可接收刷新令牌。

我对OAuth2.0并不很熟悉,而且SDK / API是基于OAuth构建的,所以有人知道我做错了什么或者我该如何处理吗?

非常感谢所有善意和有帮助的回答!

PS:我使用的是Live SDK 5.6而不是新的OneDrive API,因为它无法访问日历信息。


有没有人有想法? - Tobias Raphael Dieckmann
如果您查看liveSdk的源代码,那么您会发现在大多数执行请求时,都会调用RefreshTokenIfNeeded()方法。因此,我认为刷新令牌并没有暴露出来,因为它是自动处理的。 - Romasz
我已经从NuGet包中安装了Live SDK 5.6.3,并且loginResult.Session具有RefreshToken属性,因此不确定在没有此类属性的情况下您使用的是什么。 - Evk
@Evk:你能否发布一下你的源代码?你使用的是哪种项目类型? - Tobias Raphael Dieckmann
简单的控制台应用程序,我记得是.NET 4.5。没有特定的源代码,只是在我的情况下,loginResult.Session具有AccessToken和RefreshToken属性。正如我所说,通过NuGet安装了包。 - Evk
@Evk 在Windows Store应用程序中,您将看不到刷新令牌,因为有条件编译开关关闭了刷新令牌#if !WINDOWS_STORE - Romasz
1个回答

2

wl.offline_access

这里谈到的是用户授权,允许应用在用户不在场时(离线状态下),有用户的授权来工作。
这并不意味着应用会在系统离线时登录用户,而是会请求用户允许应用在用户不在场时工作。
我之前在一个项目中使用了Live SDK来获取用户数据,但是为了使用日历功能,我不得不使用Office365。现在你甚至可以使用Outlook API。 虽然我们可以使用loginResult.Session.AccessToken获取访问令牌,但我认为WinRT应用程序不会生成refreshToken。


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