Shouldn't the use of the token/secret be the same between 2legged and  
3legged? I thought the main difference (pardon my ignorance if i am  
completely wrong here) is the way that the token/secret is acquired,  
not the use?

Frank
On Apr 15, 2009, at 6:41 AM, isyndica wrote:

>
> Hey Jeff,
>
> Thanks for chiming in!  Well, actually I get the token and all - the  
> 3-
> legged OAuth part works perfectly: I request a token, get it, proceed
> to authorization, convert it and get my final token and secret just
> fine.
> It's just, after that, I don't know how to use my prety OAuth Access
> token/secret with the rest of the library.
>
> So I take it I'm traveling in unknown territory here then?
>
>
>
> On Apr 14, 2:23 pm, Jeff Fisher <api.jfis...@google.com> wrote:
>> I don't think the .NET client library supported three-legged OAuth  
>> at this
>> time; only two-legged OAuth. I would bring it up in the .NET client  
>> library
>> forum:
>>
>> http://groups.google.com/group/gdata-dotnet-client-library
>>
>> Cheers,
>> -Jeff
>>
>> On Mon, Apr 13, 2009 at 11:35 PM, isyndica <isynd...@gmail.com>  
>> wrote:
>>
>>> 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=<https://www.google.com/accounts/%0AOAuthAuthorizeToken?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