Archive for the ‘en’ tag
Tutorial: Authenticating with Google OAuth
Recently I’ve been trying to get Google OAuth to work with my small tool but try as I might, I found no tutorial on the Internet on how to authenticating with Google OAuth using .NET Desktop application. With a few efforts I’ve been able to get it working and decide to share the knowledge with people who still have difficulty.
Authenticating with Google OAuth is similiar to other OAuth application, but there’s a few tricks to get it working with desktop application because of the nature of windows form. Some few main points you need to remember:
– ConsumerKey and ConsumerSecrets should be “anonymous”
– You should have a personal host lying around (free one is ok) as a callback to get verification code (I will get to that later).
What you need ?
– Scope of data you want to get. Generally a URL which define the data scope of Google service (Contacts, Calendar..) you wish to access. You can find sample data scopes here.
– DevDefined’s OAuth library. You can get it here.
For the purpose of this example, I will use “https://www.google.com/m8/feeds/” as I need to access user’s contacts.
Step 1: Get unauthorized request token.
string requestUrl = "https://www.google.com/accounts/OAuthGetRequestToken"; string userAuthorizeUrl = "https://www.google.com/accounts/accounts/OAuthAuthorizeToken"; string accessUrl = "https://www.google.com/accounts/OAuthGetAccessToken"; string callBackUrl = "http://yourhost.com/callback.htm"; //Blank callback HTML page on your host var context = new OAuthConsumerContext() { ConsumerKey = "anonymous", ConsumerSecret = "anonymous", SignatureMethod = SignatureMethod.HmacSha1, //Remember to use SignatureMethod.HmacSha1 because we're desktop application }; var session = new OAuthSession(context, requestUrl, userAuthorizeUrl, accessUrl, callBackUrl) .WithQueryParameters(new { scope = "http://www.google.com/m8/feeds", xoauth_displayname = "Sample Google OAuth application" }); //xoauth_displayname will be your application name displayed on Google confirmation page, so choose carefully. var requestToken = session.GetRequestToken();
Step 2: Now we have the unauthorized request token, next step is get Authorization Url so user can grant us access
var loginUri = new Uri(session.GetUserAuthorizationUrlForToken(requestToken)); GoogleLoginForm form = new GoogleLoginForm(loginUri, callBackUrl);
The idea is you create a form which consist of one WebBrowser control, direct user to AuthorizationUrl and parse the verifier code in your callback’s url, here’s the whole code behind for that form:
public partial class GoogleLoginForm : Form { private Uri _loginUri; string _callBackUrl; string _OAuthVerifierToken; public string OAuthVerifierToken { get { return _OAuthVerifierToken; } } public GoogleLoginForm(Uri authUri, string callBackUrl) { _loginUri = authUri; _callBackUrl = callBackUrl; InitializeComponent(); } private void GoogleLoginForm_Load(object sender, EventArgs e) { wbGoogleLogin.Url = _loginUri; } private void wbGoogleLogin_Navigated(object sender, WebBrowserNavigatedEventArgs e) { string fullPath = e.Url.ToString(); if (fullPath.StartsWith(_callBackUrl)) { string key = "oauth_verifier="; //callback.htm?oauth_token=CKF50YzIHxCT85KMAg&oauth_verifier=fERNOO3NfWph90CPCeIutmFA int index = fullPath.IndexOf(key); if (fullPath.IndexOf(key) != -1) { int length = fullPath.IndexOf("&", index) == -1 ? fullPath.Length - (index + key.Length) : fullPath.IndexOf("&", index) - (index + key.Length); _OAuthVerifierToken = fullPath.Substring(index + key.Length, length); DialogResult = DialogResult.OK; } else DialogResult = DialogResult.Cancel; } } }
The idea is we will try to parse verifier code when we detect user redirected to our callback url, then:
Step 3: Exchange request token for access token
IToken accessToken; var dr = form.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { accessToken = session.ExchangeRequestTokenForAccessToken(requestToken, form.OAuthVerifierToken); }
You see, it’s just that easy, if we have access token then everything just go straight forward:
Step 5: Connect to Google
var request = new ContactsRequest(new RequestSettings("Sample Google OAuth application", "anonymous", "anonymous", accessToken.Token, accessToken.TokenSecret, "", ""));
That’s it. Now you can use your request like everyday use. If you don’t know how to working with Google Data API .NET then refer here.
Games I have finished
I played a lot of game, and, mind you, own quite a collection. Sometime I have the patient to finish some of them, but mostly they’re left somewhere in the middle, just because I don’t have enough time to play everything I bought. Games in Vietnam is dirt cheap, I know. That’s a part of the reason I have too many games in my hand to play.
In Vietnam you can’t just go out and buy a legal version of the game you want. No one sells it because majority of the population don’t have enough money to spend 60$ on each game released. Games are generally sold for about 1$/DVD/game here (yes we price game by the number of DVDs it takes, 4 or 5 years ago it’s priced by CDs). I have about 10-20games lying around and only managed to completed 1 or 2 games I really like. The only console which have games selling legally is PlayStation 3, just because it’s unhackable. If Gamestop have a store here they will go bankrupt because their pricing on used games can’t compete with stores in Vietnam. Generally customers can just bring old game to store which they bought their PS3s and have another game in exchange for like 6$, as opposed to Gamestop where you lose like 20 or 30$ when you sold it back. I dare you enter our realm, Gamestop !
Leopard versus Win 7
For a few days I have been trying to install Leopard to my new PC.
At first it proves to be difficult, which should not be, because theoretically Intel Mac and PC are running on the same architecture.  After a week of trying to have Kalyway version of Leopard boot with no success, i decided to search around, and it turns out that my particular mainboard, Asus P5Q Pro , need to update a modded Bios firmware to be able to successfully boot into Mac OS.
So I went ahead and flashed new firmware into my computer (WARNING: kids don’t try this at home), and the rest of the process turn out to be much simpler, except, Leopard doesn’t like my PS/2 keyboard, not-one-bit. It’s 8:30 PM and I rode to my nearest computer shop, which is 4kms away from my house, just in time to buy a 10$ Dell keyboard before they closed.
And from dust it booted. Leopard is great, even better with a 22″ LCD. Only a few drivers need to be installed and it runs at its full glory. No wonder Macs still hold a considerable install base among home PCs. User interface is beautiful, from interface elements to transition effect, everything just blend nicely with each other. Before Win7 (more on that later), no Microsoft OS can hold a candle to Mac OS X. Apple’s designers sure need to be the greatest guys from all over the world to be able to design such a masterpiece.
It’s all about details. You click on an icon, it “bounces” nicely until the application is loaded. You push the Expose button, and all open windows are laid nicely before you for your switching needed (believe me, I really miss it when I get back to Windows). You click on minimize button, and your window “minimizes” with a nice animation, both please to the eyes and at the same time provide you a visual “cue” where your windows minimize to, nice.
That’s really something Microsoft missed when they release Windows Vista. The concept is good, the OS is solid, but it’s like rough diamond. Everything feel like XP with a new sugar coat. It’s rough. No one like it. It’s nice to see but painfully to use. But Microsoft really changes the game with Windows 7. And I can say that’s it’s the most polished Windows ever. Dare I say that Windows 7 is even better than Leopard. Much better.
I will get back about Windows 7 later.
Stair to the sky ?
PRO WC !
Google Contact Sync 1.0
Warning:
GCS now has a dedicated page here. Please check back for more info and updates
Faces of life
Ngứa tay quá up mấy cái ảnh hôm mới sang Denmark đầu tháng. Cũng không đến nỗi tệ lắm nhỉ? :D.