0

我有一个项目,我在我的 Rasp Pi 2 上运行(带监视器)并将其连接到互联网,这样我就可以从托管第 3 方的服务以及我在 Azure 中建立的服务获取数据。

所有 REST 调用都运行良好。但是,谷歌日历调用的 oAuth 部分仅适用于我的开发机器和其他具有内置浏览器的机器。

有没有一种方法可以保存在我的开发机器上运行调试生成的任何令牌,并将其用于部署到 RP2 上?

我的 .sln 构建操作中有我的 client_secret.json 文件属性 = 内容并复制到输出目录 = 始终复制

我在我的开发机器上工作的代码:

var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        new Uri("ms-appx:///client_secret.json"),
                        new[] { Uri.EscapeUriString(CalendarService.Scope.Calendar) },
                        calendarOwner,
                        CancellationToken.None);

        var calendarService = new CalendarService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential,
            ApplicationName = "myappname"
        });

        var calendarListResource = await calendarService.CalendarList.List().ExecuteAsync();

任何关于如何在我的 rp2 上运行它的帮助或见解将不胜感激!这是我第一次尝试 rp2 + win10iot 的东西。

更新:我收到的异常如下:错误:“UserCancel”,描述:“WebAuthenticationBroker没有返回代码或错误。详细信息:0”,Uri:“”它在执行时直接跳转到我的catch块AuthorizeAsync() 方法。

4

1 回答 1

1

[更新] 我得到了一些新信息,这可能对你也有帮助。通过 OAuth 的身份验证由浏览器窗口提供。Win 10 IOT 中没有包含浏览器,因此这是不可能的。根据这篇博文,我正在尝试使用此处描述的其他设备来实现无头身份验证。

[旧帖] 对不起,我暂时没有帮助,但我也在寻找解决这个问题的方法。我尝试使用 WebAccountProvider 对我的 Azure AD 进行身份验证。在本地机器上部署工作得很好,但是在部署到我的运行 Windows 10 IOT 的 RaspberryPi 时,输入凭据的“Windows”甚至没有打开!

我的代码(根据Jason Lattimers Blogpost):

public static class CurrentEnvironment
{
    # region Class Level Members
    private const string _clientID = "[MYCLIENTID]";
    public const string CrmServiceUrl = "https://MYCRMORG.crm4.dynamics.com";
    private const string _authority = "https://login.microsoftonline.com/common/oauth2/authorize";
    private static string _accessToken;

    # endregion

    public static async Task<string> Initialize()
    {
        //var redirect = GetAppRedirectURI();
        try
        {
            WebAccountProvider wap =
                    await WebAuthenticationCoreManager.FindAccountProviderAsync("https://login.microsoft.com", _authority);

            WebTokenRequest wtr = new WebTokenRequest(wap, string.Empty, _clientID);
            wtr.Properties.Add("resource", CrmServiceUrl);
            WebTokenRequestResult wtrr = await WebAuthenticationCoreManager.RequestTokenAsync(wtr);

            if (wtrr.ResponseStatus == WebTokenRequestStatus.Success)
            {
                _accessToken = wtrr.ResponseData[0].Token;
            }

        }
        catch (Exception ex)
        {

        }

        return _accessToken;}
于 2016-02-03T07:50:03.093 回答