Hi,

I have a working implementation using AuthSub and the Google API
library working fine, but I'd really like to use OAuth, if anythign to
learn it a bit.

I managed to get the authentication loop working with:

// Part 1 :: Getting a token and getting it authorized

string consumerKey = "consumer key from registered application";
string consumerSecretKey = "consumer secret key from registered
application";

OAuthUtil oou = new OAuthUtil();
string oauth_nonce = oou.GenerateNonce();
string oauth_timestamp = oou.GenerateTimeStamp();
string oauth_normalized_url;
string oauth_normalized_params;

string oauth_signature = oou.GenerateSignature(new Uri("https://
www.google.com/accounts/OAuthGetRequestToken?scope=" +
Uri.EscapeDataString("http://picasaweb.google.com/data/";)),
consumerKey, consumerSecret, null, null, "GET", oauth_timestamp,
oauth_nonce, OAuthUtil.SignatureTypes.HMACSHA1, out
oauth_normalized_url, out oauth_normalized_params);

string getTokenUrl = oauth_normalized_url + "?" +
oauth_normalized_params + "&" + Uri.EscapeDataString
("oauth_signature") + "=" + Uri.EscapeDataString(oauth_signature);

NameValueCollection oauthtokendata = null;
HttpWebRequest request = WebRequest.Create(tbLoginUrl.Text) as
HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as
HttpWebResponse)
{
  using (TextReader reader = new StreamReader
(response.GetResponseStream()))
  {
     oauthtokendata = HttpUtility.ParseQueryString(reader.ReadToEnd
());
  }
}

string authorizeTokenUrl = "https://www.google.com/accounts/
OAuthAuthorizeToken?oauth_token=" + Uri.EscapeDataString(oauthtokendata
["oauth_token"]) + "&oauth_callback=" + Uri.EscapeDataString("https://
mydomain.com/google.auth.callback?s=picasa&");

Then in the callback page:

// Part 2 :: Converting the token to an access token

OAuthUtil oou = new OAuthUtil();
string oauth_nonce = oou.GenerateNonce();
string oauth_timestamp = oou.GenerateTimeStamp();
string oauth_normalized_url;
string oauth_normalized_params;

string token = "oauth_token from querystring";
string token_secret = "oauth secret from query string";

string oauth_signature = oou.GenerateSignature(new Uri("https://
www.google.com/accounts/OAuthGetAccessToken"), consumerKey,
consumerSecret, Uri.EscapeDataString(token), token_secret, "GET",
oauth_timestamp, oauth_nonce, OAuthUtil.SignatureTypes.HMACSHA1, out
oauth_normalized_url, out oauth_normalized_params);

string convertTokenUrl = oauth_normalized_url + "?" +
oauth_normalized_params + "&" + Uri.EscapeDataString
("oauth_signature") + "=" + Uri.EscapeDataString(oauth_signature);

NameValueCollection oauthtokendata = null;
HttpWebRequest request = WebRequest.Create(convertTokenUrl) as
HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as
HttpWebResponse)
{
  using (TextReader reader = new StreamReader
(response.GetResponseStream()))
  {
     oauthtokendata = HttpUtility.ParseQueryString(reader.ReadToEnd
());
  }
}
string oauth_access_token = oauthtokendata["oauth_token"];
string oauth_access_token_secret = oauthtokendata
["oauth_token_secret"];



Fine... so this is working perfect (and might be useful if anyone was
looking for an example in C#, since I couldn't really find any).

But now... I have no clue how I'm supposed to do the Upload anymore.
This is what I did with AuthSub:

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("lh2",
"mydomain.com");
// We assign the RSA key for request encryption - that's a special
function that would decrypt the key from my certificate as uploaded
when registering the application
authFactory.PrivateKey = getRsaKey();

// We set the token (long term session token)
authFactory.Token = "the access token AuthSub had given me after
conversion";

PicasaService service = new PicasaService(consumerKey); //
authFactory.ApplicationName);
service.RequestFactory = authFactory;

// Upload for the user associated to the token and into the "Drop Box"
Uri postUri = new Uri(PicasaQuery.CreatePicasaUri("default",
"default"));

// Format the path to the file to upload - for our exampe this is the
"testupload.jpg" file that's copied along side the program in the
output folder
string sourceFilePath = Path.Combine(GetRunnginAssemblyPath
(),"testupload.jpg");

// Open a read stream to the file
string uploadedPhotoId = "";
using (FileStream stream = new FileStream(sourceFilePath,
FileMode.Open, FileAccess.Read))
{
   // Use the "Insert" method on the service to upload the file
   PicasaEntry entry = (PicasaEntry)service.Insert(postUri, stream,
"image/jpeg", sourceFilePath);
   PhotoAccessor pa = new PhotoAccessor(entry);
   // For information, write out the PhotoId of the newly added image
   uploadedPhotoId = pa.Id;
}

return uploadedPhotoId;


Boom - that worked beautifully.  But I have no clue how to use OAuth
instead of OAuthSub there and couldn't find any .NET example.  The
only upload example I have is with JRuby where the OAuth subsystem
seems to feature two "Token" and "TokenSecret" properties that... Are
inexistent with the .NET implementation.

I went so far as this:
GOAuthRequestFactory authFactory = new GOAuthRequestFactory("lh2",
consumerKey);
authFactory.ConsumerKey = consumerKey;
authFactory.ConsumerSecret = consumerSecret;

But that's clearly not enough (the token is associated nowhere).

I also tried using the AuthSub factory with the OAuth token (as I keep
reading it supposedly works), but... it doesn't work: keep getting
403s.

What am I missing?

Any help is most welcome.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Picasa Web Albums API" group.
To post to this group, send email to Google-Picasa-Data-API@googlegroups.com
To unsubscribe from this group, send email to 
google-picasa-data-api+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/Google-Picasa-Data-API?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to