(400)错误的请求:获取Salesforce的AccessToken错误:"invalid_grant"; [英] (400) Bad Request : Get AccessToken of Salesforce error:"invalid_grant"

查看:341
本文介绍了(400)错误的请求:获取Salesforce的AccessToken错误:"invalid_grant";的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用带有以下代码的azure函数- 当我在本地运行azure fucntion时,一切工作正常,但是在部署之后,我的错误率低于

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

{错误":"invalid_grant",错误说明":身份验证失败"}

{"error":"invalid_grant","error_description":"authentication failure"}

功能代码-

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"];

salesforce是否需要其他设置?

Is there any other setting required from salesforce ?

修改已连接的应用程序:(编辑策略)放宽IP限制

Modify the Connected app: (Edit Policies) Relax IP restrictions

允许用户使用所有用户都可以自行授权"

Permitted Usersto "All users may self-authorize"

推荐答案

这是Azure函数中按预期方式运行的内容. ISalesforceConfigSettings并非来自任何库,它是我们自己的手写接口,其实现从环境变量中读取值.

Here is what we have in our Azure Functions that is working as expected. ISalesforceConfigSettings is not from any library, its our own hand written interface whose implementation(s) read values from Environment variables.

    /// <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类是...

Just in case if you're wondering what is SalesforceLoginResponse class is...

using Newtonsoft.Json;

namespace Models.Salesforce
{
    public class SalesforceLoginResponse
    {
        [JsonProperty("access_token")]
        public string AccessToken { get; set; }
    }
}

这篇关于(400)错误的请求:获取Salesforce的AccessToken错误:"invalid_grant";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆