c# - (400) Bad Request : Get AccessToken of Salesforce error:"invalid_grant"
问题描述
I'm using azure function with below code - everything is working fine when i run azure fucntion locally but after deployment i'm getting below error
{"error":"invalid_grant","error_description":"authentication failure"}
Function code -
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.SystemDefault | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "tokenURL");
var keyValues = new List<KeyValuePair<string, string>>();
keyValues.Add(new KeyValuePair<string, string>("grant_type", "password"));
keyValues.Add(new KeyValuePair<string, string>("client_id", "clientID"));
keyValues.Add(new KeyValuePair<string, string>("client_secret", "clientSecret"));
keyValues.Add(new KeyValuePair<string, string>("username", "userName"));
keyValues.Add(new KeyValuePair<string, string>("password", "password"));
request.Content = new FormUrlEncodedContent(keyValues);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
HttpResponseMessage response = await httpClient.SendAsync(request);
string respContent = await response.Content.ReadAsStringAsync();
var oauthResponse = JsonConvert.DeserializeObject<Dictionary<string, string>>(respContent);
string token = oauthResponse["access_token"];
Is there any other setting required from salesforce ?
Modify the Connected app: (Edit Policies) Relax IP restrictions
Permitted Usersto "All users may self-authorize"
解决方案
这是我们在 Azure Functions 中按预期工作的内容。ISalesforceConfigSettings
不是来自任何库,它是我们自己的手写接口,其实现从环境变量中读取值。
/// <summary>
/// Gets the Salesforce access token given the client_id, secret, username and password.
/// </summary>
/// <param name="log">Tracewriter log</param>
/// <param name="_settings">ISalesforceConfigSettings _settings</param>
/// <returns>A Salesforce access token</returns>
private async string GetSalesforceAccessToken(TraceWriter log, ISalesforceConfigSettings _settings)
{
var httpClient = new HttpClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;
// Create Request Body
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("client_id", _settings.SalesforceClientId),
new KeyValuePair<string, string>("client_secret", _settings.SalesforceClientSecret),
new KeyValuePair<string, string>("username", _settings.SalesforceUserName),
new KeyValuePair<string, string>("password", _settings.SalesforcePassword),
new KeyValuePair<string, string>("grant_type", _settings.SalesforceGrantType)
});
try
{
// Call to get access token
var loginResponse = await httpClient.PostAsync(_settings.SalesforceLoginUrl, formContent);
var loginResponseString = await loginResponse.Content.ReadAsStringAsync();
// Log Login Response
log.Info(loginResponseString);
// Extract Access Token
return JsonConvert
.DeserializeObject<SalesforceLoginResponse>(loginResponseString)
.AccessToken;
}
catch (Exception ex)
{
log.Error(ex.Message);
throw;
}
}
以防万一你想知道什么是SalesforceLoginResponse
类......
using Newtonsoft.Json;
namespace Models.Salesforce
{
public class SalesforceLoginResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
}
}
推荐阅读
- reporting-services - SSRS 和浏览器之间的渲染不一致导致表格未对齐
- laravel - 如何检查表单是否在laravel中提交?
- javascript - Chrome 在记录克隆的 SVGElement 时添加属性 [requiredExtensions, systemLanguage]
- c# - 存储库仅在本地开发环境中获取数据
- javascript - puppeteer API 未触发 click 事件
- android - 我们可以使用自定义应用程序更改设备时间吗?
- code-signing - 签名设置:UAC 黄色
- php - [vtiger][Webservice] 执行请求的操作时出现数据库错误
- printf - 在同一个 printf 中使用多个 fgetc 时结果反转
- docker - 如何使用 elasticsearch 配置 Jaeger?