OneDrive服务无法获得刷新令牌

时间:2016-10-04 13:15:29

标签: oauth-2.0 onedrive oauth2

我使用Xamarin.Auth对OneDrive服务进行身份验证。这个工作正常一段时间,但我似乎在那里服务的变化,所以它停止工作.. 我升级到新版本2.0并尝试再次使用它。到目前为止,初始身份验证效果很好但过了一段时间它总是开始崩溃。我意识到没有从onedrive服务发回的任何refrehs令牌。

这是调用Auth UI的代码:

private Task<IDictionary<string, string>> ShowWebView()
    {
        var tcs = new TaskCompletionSource<IDictionary<string, string>>();

        var auth = new OAuth2Authenticator(ServiceConstants.MSA_CLIENT_ID,
            string.Join(",", ServiceConstants.Scopes),
            new Uri(GetAuthorizeUrl()),
            new Uri(ServiceConstants.RETURN_URL));

        auth.Completed +=
            (sender, eventArgs) =>
            {
                tcs.SetResult(eventArgs.IsAuthenticated ? eventArgs.Account.Properties : null);
            };

        var intent = auth.GetUI(Application.Context);
        intent.SetFlags(ActivityFlags.NewTask);

        Application.Context.StartActivity(intent);

        return tcs.Task;
    }

    private string GetAuthorizeUrl()
    {
        var requestUriStringBuilder = new StringBuilder();
        requestUriStringBuilder.Append(ServiceConstants.AUTHENTICATION_URL);
        requestUriStringBuilder.AppendFormat("?{0}={1}", ServiceConstants.REDIRECT_URI,
            ServiceConstants.RETURN_URL);
        requestUriStringBuilder.AppendFormat("&{0}={1}", ServiceConstants.CLIENT_ID,
            ServiceConstants.MSA_CLIENT_ID);
        requestUriStringBuilder.AppendFormat("&{0}={1}", ServiceConstants.SCOPE,
            WebUtility.UrlEncode(string.Join(" ", ServiceConstants.Scopes)));
        requestUriStringBuilder.AppendFormat("&{0}={1}", ServiceConstants.RESPONSE_TYPE, ServiceConstants.CODE);

        return requestUriStringBuilder.ToString();
    }

授权URI是:

https://login.live.com/oauth20_authorize.srf?redirect_uri=https://login.live.com/oauth20_desktop.srf&client_id=["id"]&scope=onedrive.readwrite+wl.offline_access+wl.signin&response_type=code

我得到的回应包含6个元素:

access_token: "EwAIA..."
token_type: "bearer"
expires_in: "3600"
scope: "onedrive.readwrite wl.offline_access wl.signin wl.basic wl.skydrive wl.skydrive_update onedrive.readonly"
user_id: "41...."
state: "ykjfmttehzjebqtp"

当我使用文档(https://dev.onedrive.com/auth/msa_oauth.htm)查看时,我看不出这里有什么问题。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我打错了构造函数。这个有效:

        authenticator = new OAuth2Authenticator(ServiceConstants.MSA_CLIENT_ID,
            ServiceConstants.MSA_CLIENT_SECRET,
            string.Join(",", ServiceConstants.Scopes),
            new Uri(ServiceConstants.AUTHENTICATION_URL),
            new Uri(ServiceConstants.RETURN_URL),
            new Uri(ServiceConstants.TOKEN_URL));

使用这些常量:         Scopes = {“onedrive.readwrite”,“wl.offline_access”,“wl.signin”};

    RETURN_URL = "https://login.live.com/oauth20_desktop.srf";

    AUTHENTICATION_URL = "https://login.live.com/oauth20_authorize.srf";

    TOKEN_URL = "https://login.live.com/oauth20_token.srf";