Take the 2-minute tour ×
Salesforce Stack Exchange is a question and answer site for Salesforce administrators, implementation experts, developers and anybody in-between. It's 100% free, no registration required.

As part of my OAuth2 flow, I need to determine the login URL for the current session from my Apex class.

In order to "Redirect User to Obtain Access Authorization", I have to know whether I should be using https://login.salesforce.com/ or https://test.salesforce.com/ (for a sandbox).

I thought I would be able to find some system method or configuration value to easily determine the URL, but have come up empty after searching Google, Stack Overflow and this site.

Is this possible? If so, how?

share|improve this question
add comment

2 Answers

up vote 3 down vote accepted

Here's a link to a blog post on how to determine if you are in a Sandbox or not: http://www.michaelforce.org/recipeView?id=a0Ga000000Ekp65EAB. It takes into consideration custom domains and a few other special circumstances.

Here's the code he posted.

public class whereAmI{


    // First method will give us the edition as a string 

    public Static String getEdition(){

        // Organization object FTW!
        Organization[] org = new Organization[]{};
        org = [select Id, OrganizationType from Organization limit 1];

        // Check to make sure we have a result
        if(org.size()==1)
            return org[0].OrganizationType;
        else
            return '[still lost...]';
    }


    // Next method tells us if we're in a sandbox

    public Static Boolean isSandbox(){

        String host = URL.getSalesforceBaseUrl().getHost();
        String server = host.substring(0,host.indexOf('.'));

        // It's easiest to check for 'my domain' sandboxes first 
        // even though that will be rare
        if(server.contains('--'))
            return true;

        // tapp0 is a unique "non-cs" server so we check it now
        if(server == 'tapp0')
            return true;

        // If server is 'cs' followed by a number it's a sandbox
        if(server.length()>2){
            if(server.substring(0,2)=='cs'){
                try{
                    Integer.valueOf(server.substring(2,server.length()));
                }
                catch(exception e){
                    //started with cs, but not followed by a number
                    return false;
                }

                //cs followed by a number, that's a hit
                return true;
            }
        }

        // If we made it here it's a production box
        return false;
    }
}
share|improve this answer
add comment

You could use the System URL methods to get the current host:

URL.getSalesforceBaseUrl().getHost()

If the result starts with 'cs' then you know you're looking at a Sandbox and will need to use test.salesforce.com, otherwise use login.salesforce.com.

This isn't particularly pretty, but it will work.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.