【问题标题】:Unsupported Grant Type Salesforce OAUTH2不支持的授权类型 Salesforce OAUTH2
【发布时间】:2018-11-30 13:11:38
【问题描述】:

我正在使用 VBA 在 Salesforce 中获得授权,然后最终想要运行 Salesforce 报告并将结果转储到 Excel 中。我编写了以下内容来处理授权,但我收到了 unsupported_grant_type 错误。我到目前为止的代码:

Dim XMLHTTP As New MSXML2.XMLHTTP60
Dim username As String
Dim password As String
Dim PasswordnUsername As String
Dim argumentString As String

username = "myUsername"
password = "myPassword"

PasswordnUsername = password & ":" & username

argumentString = "?grant_type=password&" & _ 
                "client_id=abc123&" & _
                "client_secret=123abc&" & _
                "username=" & username & "&password=" & password
MsgBox (argumentString)

Set XMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
XMLHTTP.Open "POST", "https://mysalesforce.com/services/oauth2/token", False

XMLHTTP.setRequestHeader "content-type", "application/x-www-form-urlencoded"
XMLHTTP.setRequestHeader "Authorization", "basic " + Base64Encode(PasswordnUsername)

XMLHTTP.send (argumentString)

MsgBox (XMLHTTP.responseText)

当我打印 XMLHTTP.responseText 时,这里会报告 unsupported_grant_type。

任何帮助将不胜感激。提前致谢。

T

【问题讨论】:

  • 尝试删除argumentString开头的第一个?,然后发送请求并查看是否收到不同的错误消息。所以:argumentString = "grant_type=password&" & _ "client_id=abc123&" & _ "client_secret=123abc&" & _ "username=" & username & "&password=" & password。此外,如果 argumentString 中的参数包含非 URL 安全字符,您可能需要对它们进行 URL 编码。
  • 谢谢你。删除 ?成功了。我从没想过会这么简单。再次感谢!!

标签: vba salesforce authorization


【解决方案1】:

您正在使用"Username-password flow"。 URL 中的所有参数,不显示让用户直接向 SF 输入凭据的弹出窗口(理想情况下,如果存在用户交互而不是后端系统相互通信,您应该使用another OAuth flow,这样您的应用程序就不会处理密码,不能泄露它们)。

疑难解答:

  1. 确保您的请求中的username 已编码。至少放%40 而不是@。如果您的尝试甚至没有出现在用户的登录历史记录中 - 用户名错误/编码不正确。
  2. 您可能还需要将安全令牌也以静默方式附加到密码(再次查看用户的登录历史记录,可能出现“失败:需要 API 安全令牌”)。
  3. 如果您使用设置 -> 我的域功能,请检查您是否可以从通用 login.salesforce.com 登录。也许您的组织禁用了它并只允许品牌登录域(也会影响 API 访问)。或者您的管理员可能只允许从某些 IP 登录...
  4. 另外,您不需要添加Authorization: Basic + 用户名并在此调用中传递,您将其传递到 POST 的有效负载中就足够了。

如果您有 Postman、curl、SoapUI 或任何类似的客户端 - 在直接跳到 VBA 之前可能会有所帮助?

这对我有用(带有Content-Type: application/x-www-form-urlencoded 标头)

【讨论】:

  • 嗨,你知道如何在没有用户名和密码的情况下做同样的事情吗?
  • 嗨@JPG,也许可以发布一个关于你需要什么的新问题,我们会看看什么是有意义的。您可以通过创建一个 Visualforce 页面,在“站点”上公开它来获得完全匿名的访问,未经身份验证的人可以访问它,传递参数。但请注意黑客和垃圾邮件发送者。顺丰有很多登录流程:help.salesforce.com/…。也许您可以显示 SF 登录页面,它会以会话 ID 回到您的应用程序(您看不到密码,只是成功),例如 stackoverflow.com/a/61820476/313628
  • 也许您可以在 SF 中对用户进行预授权(使用证书制作“已连接的应用程序”并指定可以使用哪些配置文件),然后您的应用程序只需要传递用户名并使用证书签署请求(信任通过离线交换的证书,而不是通过密码)。为此,请查看 JWT 流程 help.salesforce.com/…。这是非常酷的演练:gist.github.com/booleangate/30d345ecf0617db0ea19c54c7a44d06f
  • 伙伴@eyescream 我刚刚和一些同事聊了聊你所说的话,他们对黑客或垃圾邮件发送者也有同样的看法。我相信我想要实现的目标非常简单,并且之前已经完成。这是问题stackoverflow.com/questions/63254838/…提前谢谢
猜你喜欢
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2018-09-07
  • 2017-09-18
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2017-06-02
相关资源
最近更新 更多