问题描述
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 set
和 access_token
的有效 refresh_token
。