ASP.NET 中的 Xero 授权取消

问题描述

public async Task Callback(string code,string state)
        {
            try
            {
                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
                var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
                string ClientID = state.Split(',')[0];
                string CompanyID = state.Split(',')[1];
                string ClientSecret = string.Empty;
                DataTable dt = objIntegration.GetIntegrationCompanyDetail(ClientID,CompanyID);
                if (dt.Rows.Count > 0)
                {
                    XeroConfiguration XeroConfig = new XeroConfiguration
                    {
                        ClientId = ClientID,ClientSecret = dt.Rows[0]["ClientSecretKey"].ToString(),CallbackUri = new Uri(ConfigurationManager.AppSettings["XeroCallbackUri"]),Scope = ConfigurationManager.AppSettings["XeroScope"],State = ClientID + "," + CompanyID
                    };
                    var client = new XeroClient(XeroConfig,httpClientFactory.CreateClient());
                    var xeroToken = (XeroOAuth2Token)await client.RequestAccesstokenAsync(code);
                    List<Tenant> tenants = await client.GetConnectionsAsync(xeroToken);
                    Tenant firstTenant = tenants[0];
                    string serializedXeroToken = JsonConvert.SerializeObject(xeroToken);
                   
                    objIntegration.UpdateIntegrationDetail(CallbackResonse.Tenants[0].TenantId,CallbackResonse.Accesstoken,CallbackResonse.RefreshToken,CallbackResonse.ExpiresAtUtc,serializedXeroToken,ClientID,CompanyID);
                    System.Web.HttpContext.Current.Response.Redirect(ConfigurationManager.AppSettings["XeroSuccessUri"]);
                }
            }
            catch (Exception ex)
            {
            }
        }

这是我的代码,如果我在 xero 授权中取消它抛出 No HTTP resource was found that match the request URI 'https://localhost:/api/Xero/Callback?error=access_denied&state=1B5D7F8C60534E19BC91E3919357B5B1,323' .如何解决这个问题

解决方法

看起来您的重定向 URI 缺少本地主机端口号可能存在​​问题。我建议检查您的重定向 URI 以确保它与您运行项目的本地主机端口相匹配。

如果端口正确,当您在用户取消授权后尝试使用 Xero 客户端请求访问令牌时,您很可能会收到不同的异常:

var xeroToken = (XeroOAuth2Token)await client.RequestAccessTokenAsync(code);

( ArgumentException: 参数是必需的 (Parameter 'code') )

这是因为当授权被取消时,您将不会在请求中收到代码参数,而是在回调中添加了错误参数。 (错误=访问被拒绝)

您可以通过检查回调方法中的错误参数来处理此错误。

var error = HttpContext.Request.Query["error"].ToString();
if (error == "access_denied")
{
    //handle the error - redirect back to main/login screen with a message?
}

希望这个回答对你有帮助。

,

您是否已通读 Xero-NetStandard 存储库的自述文件?

首先你需要通过授权 URL 发送给用户

return Redirect(client.BuildLoginUri());

然后,当它们返回时,您将临时 code 交换为包含 token setaccess_token 的有效 refresh_token

https://github.com/XeroAPI/Xero-NetStandard