112
votes

Is anyone else having a difficult time getting Twitters oAuth's callback URL to hit their localhost development environment. Apparently it has been disabled recently. http://code.google.com/p/twitter-api/issues/detail?id=534#c1

Does anyone have a workaround. I don't really want to stop my development

17
It worked for me by setting twitter callback url to my real website url. While testing in localhost -> twitter signup, redirected to localhost (instead of website url).Sudhakar Krishnan

17 Answers

135
votes

Alternative 1.

Set up your .hosts (Windows) or etc/hosts file to point a live domain to your localhost IP. such as:

127.0.0.1 xyz.com

where xyz.com is your real domain.

Alternative 2.

Also, the article gives the tip to alternatively use a URL shortener service. Shorten your local URL and provide the result as callback.

Alternative 3.

Furthermore, it seems that it works to provide for example http://127.0.0.1:8080 as callback to Twitter, instead of http://localhost:8080.

25
votes

I just had to do this last week. Apparently localhost doesn't work but 127.0.0.1 does Go figure.

This of course assumes that you are registering two apps with Twitter, one for your live www.mysite.com and another for 127.0.0.1.

11
votes

Just put http://127.0.0.1:xxxx/ as the callback url, where xxxx is the port for your framework

8
votes

Yes, it was disabled because of the recent security issue that was found in OAuth. The only solution for now is to create two OAuth applications - one for production and one for development. In the development application you set your localhost callback URL instead of the live one.

8
votes

Callback URL edited

http://localhost:8585/logintwitter.aspx

Convert to

http://127.0.0.1:8585/logintwitter.aspx
7
votes

This is how i did it:

Registered Callback URL: http://127.0.0.1/Callback.aspx

   OAuthTokenResponse authorizationTokens = 
        OAuthUtility.GetRequestToken(ConfigSettings.getConsumerKey(), 
                                     ConfigSettings.getConsumerSecret(), 
                                     "http://127.0.0.1:1066/Twitter/Callback.aspx");

ConfigSettings:

public static class ConfigSettings
{
    public static String getConsumerKey()
    {
        return System.Configuration.ConfigurationManager.AppSettings["ConsumerKey"].ToString();
    }

    public static String getConsumerSecret()
    {
        return System.Configuration.ConfigurationManager.AppSettings["ConsumerSecret"].ToString();
    }

}

Web.config:

<appSettings>

    <add key="ConsumerKey" value="xxxxxxxxxxxxxxxxxxxx"/>
    <add key="ConsumerSecret" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>

</appSettings>

Make sure you set the property 'use dynamic ports' of you project to 'false' and enter a static port number instead. (I used 1066).

I hope this helps!

7
votes

Use http://smackaho.st

What it does is a simple DNS association to 127.0.0.1 which allows you to bypass the filters on localhost or 127.0.0.1 :

smackaho.st. 28800 IN A 127.0.0.1

So if you click on the link, it will display you what you have on your local webserver (and if you don't have one, you'll get a 404). You can of course set it to any page/port you want :

http://smackaho.st:54878/twitter/callback

5
votes

I was working with Twitter callback url on my localhost. If you are not sure how to create a virtual host ( this is important ) use Ampps. He is really cool and easy. In a few steps you have your own virtual host and then every url will work on it. For example:

  1. download and install ampps

  2. Add new domain. ( here you can set for example twitter.local) that means your virtual host will be http://twitter.local and it will work after step 3.

  3. I am working on Win so go under to your host file -> C:\Windows\System32\Drivers\etc\hosts and add line: 127.0.0.1 twitter.local

Restart your Ampps and you can use your callback. You can specify any url, even if you are using some framework MVC or you have htaccess url rewrite.

Hope This Help! Cheers.

3
votes

When I develop locally, I always set up a locally hosted dev name that reflects the project I'm working on. I set this up in xampp through xampp\apache\conf\extra\httpd-vhosts.conf and then also in \Windows\System32\drivers\etc\hosts.

So if I am setting up a local dev site for example.com, I would set it up as example.dev in those two files.

Short Answer: Once this is set up properly, you can simply treat this url (http://example.dev) as if it were live (rather than local) as you set up your Twitter Application.

A similar answer was given here: https://dev.twitter.com/discussions/5749

Direct Quote (emphasis added):

You can provide any valid URL with a domain name we recognize on the application details page. OAuth 1.0a requires you to send a oauth_callback value on the request token step of the flow and we'll accept a dynamic locahost-based callback on that step.

This worked like a charm for me. Hope this helps.

3
votes

It can be done very conveniently with Fiddler:

  • Open menu Tools > HOSTS...
  • Insert a line like 127.0.0.1 your-production-domain.com, make sure that "Enable remapping of requests..." is checked. Don't forget to press Save.
  • If access to your real production server is needed, simply exit Fiddler or disable remapping.
  • Starting Fiddler again will turn on remapping (if it is checked).

A pleasant bonus is that you can specify a custom port, like this: 127.0.0.1:3000 your-production-domain.com (it would be impossible to achieve this via the hosts file). Also, instead of IP you can use any domain name (e.g., localhost).

This way, it is possible (but not necessary) to register your Twitter app only once (provided that you don't mind using the same keys for local development and production).

2
votes

edit this function on TwitterAPIExchange.php at line #180

public function performRequest($return = true)
{
    if (!is_bool($return)) 
    { 
        throw new Exception('performRequest parameter must be true or false'); 
    }

    $header = array($this->buildAuthorizationHeader($this->oauth), 'Expect:');

    $getfield = $this->getGetfield();
    $postfields = $this->getPostfields();

    $options = array( 
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_HEADER => false,
        CURLOPT_URL => $this->url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false
    );

    if (!is_null($postfields))
    {
        $options[CURLOPT_POSTFIELDS] = $postfields;
    }
    else
    {
        if ($getfield !== '')
        {
            $options[CURLOPT_URL] .= $getfield;
        }
    }

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);

    if ($return) { return $json; }
}
2
votes

I had the same challenge and I was not able to give localhost as a valid callback URL. So I created a simple domain to help us developers out: https://tolocalhost.com

It will redirect any path to your localhost domain and port you need. Hope it can be of use to other developers.

2
votes

Seems nowadays http://127.0.0.1 also stopped working. A simple solution is to use http://localtest.me instead of http://localhost it is always pointing to 127.0.0.1 And you can even add any arbitrary subdomain to it, and it will still point to 127.0.0.1

See Website

1
votes

set callbackurl in twitter app : 127.0.0.1:3000 and set WEBrick to bind on 127.0.0.1 instead of 0.0.0.0

command : rails s -b 127.0.0.1

1
votes

Looks like Twitter now allows localhost alongside whatever you have in the Callback URL settings, so long as there is a value there.

1
votes

I struggled with this and followed a dozen solutions, in the end all I had to do to work with any ssl apis on local host was:

Go download: cacert.pem file

In php.ini * un-comment and change: curl.cainfo = "c:/wamp/bin/php/php5.5.12/cacert.pem"

  • You can find where your php.ini file is on your machine by running php --ini in your CLI
  • I placed my cacert.pem in the same directory as php.ini for ease.
1
votes

These are the steps that worked for me to get Facebook working with a local application on my laptop:

  • goto apps.twitter.com
  • enter the name, app description and your site URL Note: for localhost:8000, use 127.0.0.1:8000 since the former will not work
  • enter the callback URL matching your callback URL defined in TWITTER_REDIRECT_URI your application Note: eg: http://127.0.0.1/login/twitter/callback (localhost will not work).
  • Important enter both the "privacy policy" and "terms of use" URLs if you wish to request the user's email address
  • check the agree to terms checkbox
  • click [Create Your Twitter Application]
  • switch to the [Keys and Access Tokens] tab at the top
  • copy the "Consumer Key (API Key)" and "Consumer Secret (API Secret)" to TWITTER_KEY and TWITTER_SECRET in your application
  • click the "Permissions" tab and set appropriately to "read only", "read and write" or "read, write and direct message" (use the least intrusive option needed for your application, for just and OAuth login "read only" is sufficient
  • Under "Additional Permissions" check the "request email addresses from users" checkbox if you wish for the user's email address to be returned to the OAuth login data (in most cases check yes)