Salesforce REST API 登录?

Posted

技术标签:

【中文标题】Salesforce REST API 登录?【英文标题】:Salesforce REST API Login? 【发布时间】:2012-03-04 17:52:18 【问题描述】:

我正在检查 salesforce 开发人员站点中的示例。

在该示例中,当我们单击链接时,它将被重定向到 salesforce 登录页面。如果登录成功,则颁发访问令牌。

我不希望我的应用程序重定向到 salesforce 登录页面。在现有示例中,环境变量设置为,

“https://login.salesforce.com”

我应该怎么做才能避免重定向到 salesforce 登录页面。

【问题讨论】:

【参考方案1】:

你所描述的,听起来像 OAuth(只是因为你提到了访问令牌)。

下面有一个在 Salesforce 中使用 OAuth 的好例子...

http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_at_Salesforce.com

【讨论】:

感谢您的回复。我发现我必须使用用户名密码 oauth 流程来满足我的需要。 login.salesforce.com/help/doc/en/… => 这是我们必须参考的链接。但是虽然我已经按照我的应用程序仍然重定向的步骤。 :( 您是否正确地遵循“oauth dance”的步骤?记住你需要 3 个东西,request-token-url,api-url,access-token-url。 解决方案:大家好,我已经找到了我的问题的解决方案。实际上,我正在检查链接 wiki.developerforce.com/page/… 中给出的示例。然后实现了来自login.salesforce.com/help/doc/en/… 的 OAuth 2.0 用户名密码流。它解决了我的问题。感谢您的回复。 只是为了让您知道用户名密码流程仅推荐用于测试目的,如果您需要 JWT Bearer 令牌的非使用交互,则推荐使用 另一个因链接失效而丢失的答案【参考方案2】:

解决方案:

大家好,我已经解决了我的问题。实际上,我正在检查链接 http://wiki.developerforce.com/page/Getting_Started_with_the_Force.com_REST_API 中给出的示例。然后实现了来自https://login.salesforce.com/help/doc/en/remoteaccess_oauth_username_password_flow.htm#send_up_response 的 OAuth 2.0 用户名密码流。它解决了我的问题。

【讨论】:

【参考方案3】:

这是使用用户名-密码 OAuth 流程的示例 Java 代码:

public class AccountQuery 

    // The connection data
    private static final String query = "SELECT Name, Idfrom Account";
    private static final String clientId = "theID";
    private static final String clientSecret = "theSecret";
    // THis is meaningless in our context
    private static final String redirectUri = "https://localhost:8443/_callback";
    private static final String environment = "https://login.salesforce.com";   
    private static String tokenUrl = null;
    private static final String username = "username";
    private static final String password = "passwordPlusSecret";
    private static String accessToken = null;
    private static String instanceUrl = null;

    public static void main( String[] args )
           
        // Step 0:  Connect to SalesForce.
        System.out.println("Getting a token");
        tokenUrl = environment + "/services/oauth2/token";
        HttpClient httpclient = new HttpClient();
        PostMethod post = new PostMethod(tokenUrl);     
        post.addParameter("grant_type", "password");
        post.addParameter("client_id", clientId);
        post.addParameter("client_secret", clientSecret);
        post.addParameter("redirect_uri", redirectUri);
        post.addParameter("username", username);
        post.addParameter("password", password);

        try 
            httpclient.executeMethod(post);
            try 
                JSONObject authResponse = new JSONObject(new JSONTokener(new InputStreamReader(post.getResponseBodyAsStream())));
                System.out.println("Auth response: " + authResponse.toString(2));

                accessToken = authResponse.getString("access_token");
                instanceUrl = authResponse.getString("instance_url");

                System.out.println("Got access token: " + accessToken);
             catch (JSONException e) 
                e.printStackTrace();                
            
         catch (HttpException e1) 
            e1.printStackTrace();
         catch (IOException e1) 
            e1.printStackTrace();
         finally 
            post.releaseConnection();
               
        System.out.println("We have an access token: " + accessToken + "\n" + "Using instance " + instanceUrl + "\n\n");

        HttpClient httpclient = new HttpClient();
        GetMethod get = new GetMethod(instanceUrl + "/services/data/v28.0/query");

        // set the token in the header
        get.setRequestHeader("Authorization", "OAuth " + accessToken);

        // set the SOQL as a query param
        NameValuePair[] params = new NameValuePair[1];

        params[0] = new NameValuePair("q",query);
        get.setQueryString(params);     

        try 
            httpclient.executeMethod(get);
            if (get.getStatusCode() == HttpStatus.SC_OK) 
                // Now lets use the standard java json classes to work with the results
                JSONObject response = new JSONObject( new JSONTokener( new InputStreamReader(get.getResponseBodyAsStream())));
                System.out.println("Query response: "+ response.toString(2));//.substring(0, 500));                 
                System.out.println(response.getString("totalSize") + " record(s) returned\n\n");
                JSONArray results = response.getJSONArray("records");               
                Account[] accounts = new Gson().fromJson(results.toString(), Account[].class);
                return accounts;
            
        
        catch (Exception e)
            e.printStackTrace();
        finally 
            get.releaseConnection();
        
    

【讨论】:

【参考方案4】:

如果是 Java,最简单的方法是使用 Spring Social Salesforce:https://github.com/iirekm/spring-social-salesforce

只需遵循https://spring.io/guides/gs/accessing-facebook/ 上的 Facebook 教程,简单地说就是添加对 Spring Social Salesforce 的依赖,并将代码“facebook”中的所有位置替换为“salesforce”。

【讨论】:

以上是关于Salesforce REST API 登录?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用现有的SOAP API会话验证Salesforce REST API吗?

Salesforce:任何可用于访问 Salesforce 日历的 Rest API?

Salesforce OAuth 与 REST API 使用 Javascript

在salesforce 营销云中,如何进行REST api 调用?如何建立网址?

SalesForce.com Rest API身份验证。它是否允许双腿oauth交易

Salesforce REST API 和 DELETE 方法