//-----------------------------------------------------------------------
//
// Copyright (c) Microsoft. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.AspNet.Clients {
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using DotNetOpenAuth.Messaging;
public sealed class WindowsLiveClient : OAuth2Client {
private const string TokenEndpoint = "https://oauth.live.com/token";
private const string AuthorizationEndpoint = "https://oauth.live.com/authorize";
private readonly string _appId;
private readonly string _appSecret;
public WindowsLiveClient(string appId, string appSecret)
: base("windowslive") {
if (String.IsNullOrEmpty(appId)) {
throw new ArgumentNullException("appId");
}
if (String.IsNullOrEmpty("appSecret")) {
throw new ArgumentNullException("appSecret");
}
_appId = appId;
_appSecret = appSecret;
}
protected override Uri GetServiceLoginUrl(Uri returnUrl) {
var builder = new UriBuilder(AuthorizationEndpoint);
MessagingUtilities.AppendQueryArgs(builder,
new KeyValuePair[]
{
new KeyValuePair("client_id", _appId),
new KeyValuePair("scope", "wl.basic"),
new KeyValuePair("response_type", "code"),
new KeyValuePair("redirect_uri", returnUrl.ToString())
});
return builder.Uri;
}
protected override string QueryAccessToken(Uri returnUrl, string authorizationCode) {
var builder = new StringBuilder();
builder.AppendFormat("client_id={0}", _appId);
builder.AppendFormat("&redirect_uri={0}", Uri.EscapeDataString(returnUrl.ToString()));
builder.AppendFormat("&client_secret={0}", _appSecret);
builder.AppendFormat("&code={0}", authorizationCode);
builder.Append("&grant_type=authorization_code");
WebRequest tokenRequest = WebRequest.Create(TokenEndpoint);
tokenRequest.ContentType = "application/x-www-form-urlencoded";
tokenRequest.ContentLength = builder.Length;
tokenRequest.Method = "POST";
using (Stream requestStream = tokenRequest.GetRequestStream()) {
var writer = new StreamWriter(requestStream);
writer.Write(builder.ToString());
writer.Flush();
}
HttpWebResponse tokenResponse = (HttpWebResponse)tokenRequest.GetResponse();
if (tokenResponse.StatusCode == HttpStatusCode.OK) {
using (Stream responseStream = tokenResponse.GetResponseStream()) {
var tokenData = JsonHelper.Deserialize(responseStream);
if (tokenData != null) {
return tokenData.AccessToken;
}
}
}
return null;
}
protected override IDictionary GetUserData(string accessToken) {
WindowsLiveUserData graph;
var request = WebRequest.Create("https://apis.live.net/v5.0/me?access_token=" + Uri.EscapeDataString(accessToken));
using (var response = request.GetResponse()) {
using (var responseStream = response.GetResponseStream()) {
graph = JsonHelper.Deserialize(responseStream);
}
}
var userData = new Dictionary();
userData.AddItemIfNotEmpty("id", graph.Id);
userData.AddItemIfNotEmpty("username", graph.Name);
userData.AddItemIfNotEmpty("name", graph.Name);
userData.AddItemIfNotEmpty("link", graph.Link == null ? null : graph.Link.ToString());
userData.AddItemIfNotEmpty("gender", graph.Gender);
userData.AddItemIfNotEmpty("firstname", graph.FirstName);
userData.AddItemIfNotEmpty("lastname", graph.LastName);
return userData;
}
}
}