Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Salesforce Authentication Failing

I am trying to use OAuth authentication to get the Salesforce Authentication Token, so I referred wiki docs, but after getting authorization code, when I make a Post request with 5 required parameters, I'm getting following exception

{"error":"invalid_grant","error_description":"authentication failure"} CODE 400 JSON = {"error":"invalid_grant","error_description":"authentication failure"} 

which is I guess a bad request.

PostMethod post = new PostMethod("https://login.salesforce.com/services/oauth2/token"); post.addParameter("code",##############); post.addParameter("grant_type","authorization_code"); post.addParameter("redirect_uri","#################");   post.addParameter("client_id",this.client_id); post.addParameter("client_secret",this.client_secret); httpclient.executeMethod(post); String responseBody = post.getResponseBodyAsString(); System.out.println(responseBody+" CODE "+post.getStatusCode()); 

Kindly reply, if exception known?

like image 961
Vardan Gupta Avatar asked Oct 09 '12 06:10

Vardan Gupta


People also ask

How do I resolve OAuth error in Salesforce?

The URL that SFDC presents has a session ID which expires after approximately 10 minutes of idle time. When a user tries to login after the session id is expired, the system throws the OAuth error. Solution: Typically, clearing the browser or device cache fixes the problem.

What is OAuth 2.0 and how it works in Salesforce?

With the OAuth 2.0 user-agent flow, users authorize a desktop or mobile app to access data using an external or embedded browser. Client apps running in a browser using a scripting language such as JavaScript can also use this flow. This flow uses the OAuth 2.0 implicit grant type.

How do I enable OAuth settings in Salesforce?

In the Connected Apps section, click New Connected App. In Basic Information, give the app a name, tab through the api field so it will self-populate in the correct format, and enter a contact email for the app. In the API [Enable OAuth Settings] section, select Enable OAuth Settings.


1 Answers

For anyone who is as stuck and frustrated as I was, I've left a detailed blog post on the entire process (with pictures and ranty commentary!). Click the link if you want that:

http://www.calvinfroedge.com/salesforce-how-to-generate-api-credentials/

Here is a text only answer:

Step 1:

Create an account. You can create a (free) developer account at developer.salesforce.com


Step 2:

Ignore all the landing pages and getting started crap. It's an endless marketing loop.


Step 3:

Click the "Setup" link


Step 4:

In the lefthand toolbar, under "Create", click "Apps"


Step 5:

Under "Connected Apps" click "New"


Step 6:

Fill out the form. Important fields are the ones marked as required, and the oauth section. Note that you can leave any url for your callback (I used localhost).


Step 7:

Be advised that Salesforce has crappy availability.


Step 8:

Press continue. You finally have your client_id key (labelled 'Consumer Key') and client_secret (labelled 'Consumer Secret').


Step 9:

But wait! You're not done yet; select 'Manage' then 'Edit Policies'

  1. Make sure IP relaxation is set to Relax IP restrictions,

  2. and make sure that Permitted Users is set to "All users may self-authorize.",

  3. and also make sure the your Security > Network Access > Trusted IP Ranges has been set

OAuth settings

Security > Network Access > Trusted IP Ranges

If you're concerned about disabling security, don't be for now, you just want to get this working for now so you can make API calls. Tighten permissions once you have everything working, one at a time, so you can figure out what setting is giving you authentication errors.


Step 10:

Celebrate! This curl call should succeed:

on production:

curl -v https://login.salesforce.com/services/oauth2/token \   -d "grant_type=password" \   -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \   -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \   -d "[email protected]" -d "[email protected]" 

on sandbox or test:

curl -v https://test.salesforce.com/services/oauth2/token \   -d "grant_type=password" \   -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \   -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \   -d "[email protected]" -d "[email protected]" 

Notes:

  • You shouldn't be doing password authorization if you're building a multi-tenant app, where users need to authorize their own application. Use the Oauth2 workflow for that.

  • You may need to pass in your security token appended to your password.

like image 83
Calvin Froedge Avatar answered Sep 19 '22 19:09

Calvin Froedge