Salesforce OAuth 与 REST API 使用 Javascript

Posted

技术标签:

【中文标题】Salesforce OAuth 与 REST API 使用 Javascript【英文标题】:Salesforce OAuth with REST API using Javascript 【发布时间】:2014-09-21 04:32:46 【问题描述】:

我的 Salesforce 开发人员帐户中有一个应用程序,我想允许我的用户从我正在构建的远程应用程序访问。我看到我必须先使用 OAuth2.0 来授权我的用户,然后才能允许他们访问 salesforce 数据。目前我正在尝试使用salesforce 中描述的用户名密码 OAuth 流程。

第 1 步)我通过以下代码 sn-p 使用用户名和密码请求访问令牌

var password = 'userPassword' + 'securityToken'
$.ajax(
    type: 'GET',
    url: 'https://login.salesforce.com/services/oauth2/token',
    contentType: 'application/json',
    dataType: 'json',
    beforeSend: function(xhr) 
        xhr.setRequestHeader('grant_type','password'),
        xhr.setRequestHeader('client_id',  '<client_id_here>'),
        xhr.setRequestHeader('client_secret', '<client_secret_here'),
        xhr.setRequestHeader('username', 'username@location.com'),
        xhr.setRequestHeader('password', "password")
    ,
    success: function(response) 
        console.log('Successfully retrieved ' + response);
        //Other logic here
    ,
    error: function(response) 
        console.log('Failed ' + response.status + ' ' + response.statusText);
        //Other logic here
    
);

但是,我的请求失败并显示以下消息:

1) OPTIONS https://login.salesforce.com/services/oauth2/token 400 (Bad Request) 

2) XMLHttpRequest cannot load https://login.salesforce.com/services/oauth2/token. No 
  'Access- Control-Allow-Origin' header is present on the requested resource. 
   Origin   http://localhost is therefore not allowed access. 

我看到一些消息来源(here here here)提到,salesforce 不支持 CORS,应该使用另一种解决方案。我见过的一些解决方案是 Salesforce APEX 代码、AJAX toolkit 或 ForceTK。

总之,我想看看 (1) 我在上面的请求中是否犯了一个简单的错误来获取 OAuth access_token (2),或者我是否需要做一些不同的事情来获取访问权限 (3 ) 有没有更好的方法来登录用户并从我连接的应用程序访问他们的销售人员数据?

感谢所有帮助!

【问题讨论】:

您完全在前端实现OAuth2.0 的方法将始终面临CORS 问题。 这个错误确实是因为不支持CORS。所以,你是对的,你需要以不同的方式处理它。你需要服务器端代码来处理这个。 是否有处理 Salesforce 服务器端 OAuth 的最佳方法? Salesforce APEX 代码或 AJAX 工具包?我尝试使用 [salesforce.stackexchange.com/questions/17382/… 示例)并收到“拒绝设置不安全标头“用户代理”消息。 AJAX 工具包是否可用于外部应用程序或仅可用于 VisualForce 页面? 【参考方案1】:

如果您从 javascript 应用程序发出请求,我认为您还需要在 CORS 设置中添加原始 URL/IP,以便它可以访问 salesforce 数据。

【讨论】:

这是一个评论而不是一个答案。【参考方案2】:

我在这里发布了对我有用的 ajax 代码,控制台中的这个 CORS 错误无关紧要。如果您在网络中看到,您将获得访问令牌。 请参阅下面的 ajax 代码。

function gettoken()

    var param = 
      grant_type: "password",
      client_id : "id here",
      client_secret : "seceret here ",
      username:"username",
      password:"password with full key provided by sf";
$.ajax(
    url: 'https://test.salesforce.com/services/oauth2/token',
    type: 'POST',
    data: param,
    dataType: "json",
    contentType: "application/x-www-form-urlencoded",
    success: function (data) 
        alert(data);
    

);

我希望这对你有用。

【讨论】:

响应中当然包含令牌。但是任何 JS 都不会被允许访问和使用这个令牌。所以是的......你的答案是正确的,但不能解决问题本身......【参考方案3】:

您需要在自己的服务器上处理 OAUTH 部分。这不仅仅是因为缺少 CORS,也没有办法纯粹在客户端安全地进行 OAUTH。服务器实际上可以是任何东西,但这里是一个使用 Play Framework 用 Ja​​va 编写的示例服务器,它也有一个 JavaScript / AngularJS 客户端:http://typesafe.com/activator/template/reactive-salesforce-rest-javascript-seed

【讨论】:

【参考方案4】:

您不能从 JavaScript 发出此请求。您需要发出服务器端请求。在php、C#、Java等中有很多这个流程的实现。

【讨论】:

对于我从 Salesforce 发出的所有请求,是否都是这种情况,因为它们不允许 CORS?或者,在我使用服务器端请求完成 OAuth 流程后,我是否能够从 Javascript 访问他们的 RESTful API? 一旦您通过 OAuth 流程并拥有活动的访问令牌,您应该能够从客户端发出 API 请求。有关更多信息,请参阅此页面:developer.salesforce.com/page/…

以上是关于Salesforce OAuth 与 REST API 使用 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户名和密码的情况下授权 Salesforce REST API

在Salesforce中通过REST API编辑自定义对象

Salesforce 小知识:使用 JSON web token 调用 REST 函数

Salesforce OAuth 身份验证错误请求错误

SAP CPI 和 Salesforce 之间的 OAuth 连接

Salesforce REST API 和 DELETE 方法