oauth, Twitter, and std.net.curl

wobbles via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 15 08:11:18 PDT 2015


On Monday, 15 June 2015 at 14:41:32 UTC, Taylor Gronka wrote:
> Hello,
>
> I've picked up a web design project, and I would love to use 
> vibe.d/dlang. I need to use oauth to search on a number of web 
> api's, such as searching for Twitter tweets.
>
> I tried using Adam's oauth (Thanks!). However, it doesn't 
> appear support the validation needed for searching Twitter.
> https://github.com/adamdruppe/arsd/blob/master/oauth.d
>
>
> Now I'm looking at std.net.curl, and this is my thought: is 
> HTTP.addRequestHeader(key, val) able to set the oauth 
> authentication headers? It would look a bit odd, but if 
> something like this works, then it wouldn't be difficult to 
> code for each set of headers specifically:
> 	
>     auto client = HTTP("https://api.twitter.com"); // not sure 
> if https should be set here or somewhere else
>     string bearerUrl = "https://api.twitter.com/oauth2/token";
>     client.addRequestHeader("Authorization", "Basic 
> eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw");
>     client.postData("grant_type=client_credentials");
>     client.perform();
>
> (The above example is based on Step 2 of this page)
> https://dev.twitter.com/oauth/application-only
>
>
> Of course, the oauth headers look a bit different, but I 
> imagine it being something like this:
>     client.addRequestHeader("Authorization", "OAuth2 token: 
> \"string\", tokensecret: \"string\", appkey, \"string\" ...");
> \\ not sure if that's how to escape quotes in dlang
>
>
> Can I get some guidance on this? I would really like to use 
> dlang, but I can't afford to be stuck on this for too long. I'd 
> be happy to try and write a modification of Adam's code, but I 
> lack experience, so it's a slow process for me.
>
> I'd also be happy to write up little tutorials/blogposts about 
> how I accomplish various tasks.
>
> Thanks,

You can use vibe.d to send requests rather than going the 
lowlevel curl library.

Check out the requestHTTP method [1]
 From code I've written in the past, your setup looks correct.

This is some vibe.d code I've used to get a refresh token from 
Youtube (I know it's different from twitter, but the idea is the 
same)

YoutubeToken is a local struct that contains the access_token we 
need to perform searches/post videos etc in any subsequent 
requests.

/**
  * Returns a new YoutubeToken
  */
public YoutubeToken getRefreshToken(){
     string url = "https://accounts.google.com/o/oauth2/token";

     string postBody = 
"client_id=$CLIENT_ID$&client_secret=$CLIENT_SECRET$&refresh_token=$REFRESH_TOKEN$&grant_type=$GRANT_TYPE$"
             .replaceMap(
                 [
                     "$CLIENT_ID$" : credentials.clientID,
                     "$CLIENT_SECRET$" : credentials.clientSecret,
                     "$REFRESH_TOKEN$" : credentials.refreshToken,
                     "$GRANT_TYPE$" : "refresh_token"
                 ]
             );

     logInfo("Getting new refresh token with URL: %s and postBody: 
%s", url, postBody);

     auto response = requestHTTP(url,
         (scope req){
             req.method = HTTPMethod.POST;
             req.contentType = "application/x-www-form-urlencoded";
             req.writeBody(cast(ubyte[])postBody);
         }).bodyReader.readAllUTF8().parseJsonString;

     return YoutubeToken(response["access_token"].get!string, 
response["expires_in"].get!long, 
response["token_type"].get!string );
}


[1] http://vibed.org/api/vibe.http.client/requestHTTP


More information about the Digitalmars-d-learn mailing list