OneDrive 服务没有获得刷新令牌

OneDrive Service don't get a refresh token

我使用 Xamarin.Auth 通过 OneDrive 服务进行身份验证。这在一段时间内工作正常,但我似乎在那里更改了服务,因此它停止工作了。 我升级到新版本 2.0 并尝试使其再次运行。到目前为止,初始身份验证运行良好。但过了一段时间,它总是开始崩溃。我意识到没有从 onedrive 服务发回任何刷新令牌。

这是调用 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) 检查它时,我看不出这里有什么问题。有任何想法吗?

我调用了错误的构造函数。这个有效:

        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));

使用这些常量: 范围 = {"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";