До сих пор вы видели примеры для аутентификации и работы с Facebook , Twitter и Live Id , охватывающие OAuth 1 и 2. В этом посте вы увидите, как легко мы можем взять существующий код и заставить его работать против LinkedIn.
Мы начнем с кода, который вы видели в моем предыдущем посте в Twitter Authentication . Тем не менее, прежде чем приступить к написанию кода, вам, конечно же, нужно пройти регистрацию приложения в LinkedIn. Перейдите на страницу разработчика LinkedIn и войдите в систему, используя учетную запись, в которой вы хотите зарегистрировать приложение. В правом верхнем углу вы должны увидеть имя учетной записи со стрелкой вниз. Наведите указатель мыши на стрелку и выберите пункт меню «Ключи API». Это приведет вас к списку существующих приложений, который может быть изначально пустым. Нажмите на ссылку «Добавить новую заявку» и заполните форму заявки для новой заявки. Когда вы закончите, вы должны увидеть подтверждение того, что ваша учетная запись была успешно создана, как на рисунке 1, и, что более важно, API и секретные ключи, которые вам понадобятся для доступа к API-интерфейсам LinkedIn.

Если вы еще не прошли мой предыдущий пост по аутентификации в Twitter, сделайте это сейчас, так как вам понадобится этот код в будущем. Мы начнем с изменения констант URL, которые используются как часть процесса аутентификации, а также добавления в RedirectUrl
ReauthenticateUrl
private const string RequestUrl = "https://api.linkedin.com/uas/oauth/requestToken";
private const string AuthorizeUrl ="https://www.linkedin.com/uas/oauth/authorize";
private const string AccessUrl = "https://api.linkedin.com/uas/oauth/accessToken";
private const string RedirectUrl = "https://www.linkedin.com/uas/oauth/authorize/submit";
private const string ReauthenticateUrl = "https://www.linkedin.com/uas/oauth/authorize/oob";
Вам также необходимо обновить константы ConsumerKey
ConsumerSecret
замещать и
(включая угловые скобки) с вашими ключами.
private const string ConsumerKey ="<LinkedIn API Key>";
private const string ConsumerSecret ="<LinkedIn Secret Key>";
После того как пользователь прошел проверку подлинности и авторизовал ваше приложение для доступа к своей учетной записи, веб-браузер будет перенаправлен обратно на URL-адрес, указанный в константе RedirectUrl
ReauthenticateUrl
Страница, отображаемая LinkedIn, имеет немного другой макет, поэтому вам нужно настроить регулярное выражение, используемое для извлечения булавки. Весь метод BrowserNavigated
RedirectUrl
ReauthenticateUrl
private void BrowserNavigated(object sender, NavigationEventArgs e) {
if (AuthenticationBrowser.Visibility == Visibility.Collapsed) {
AuthenticationBrowser.Visibility = Visibility.Visible;
}
if (e.Uri.AbsoluteUri.ToLower().StartsWith(RedirectUrl) ||
e.Uri.AbsoluteUri.ToLower().StartsWith(ReauthenticateUrl))
var htmlString = AuthenticationBrowser.SaveToString();
var pinFinder = new Regex(@"<div class=""access-code"">(?<pin>[A-Za-z0-9_]+)</div>", RegexOptions.IgnoreCase);
var match = pinFinder.Match(htmlString);
if (match.Length > 0) {
var group = match.Groups["pin"];
if (group.Length > 0) {
pin = group.Captures[0].Value;
if (!string.IsNullOrEmpty(pin)) {
RetrieveAccessToken();
}
}
}
if (string.IsNullOrEmpty(pin)) {
Dispatcher.BeginInvoke(() => MessageBox.Show("Authorization denied by user"));
}
// Make sure pin is reset to null
pin = null;
AuthenticationBrowser.Visibility = Visibility.Collapsed;
}
}
Другое отличие от аутентификации в Twitter состоит в том, что в конце процесса LinkedIn не возвращает никакой информации об аутентифицированном пользователе. Вместо этого вам нужно запросить API профиля для доступа к этой информации. Следующий код иллюстрирует, как выполнить HTTP GET для URL профиля.
private void RetrieveProfile() {
var profileUrl = "http://api.linkedin.com/v1/people/~";
var request = CreateRequest("GET", profileUrl);
request.BeginGetResponse(result => {
try {
var req = result.AsyncState as HttpWebRequest;
if (req == null) throw new ArgumentNullException("result", "Request parameter is null");
using (var resp = req.EndGetResponse(result))
using (var strm = resp.GetResponseStream())
{
var xml = XElement.Load(strm);
var first_name = xml.Element("first-name").Value;
var last_name = xml.Element("last-name").Value;
Dispatcher.BeginInvoke(() => {
UserNameText.Text = first_name + " " + last_name;
MessageBox.Show("Profile retrieved");
});
}
}
Catch {
Dispatcher.BeginInvoke(() => MessageBox.Show("Unable to access profile"));
}
}, request);
}
Наконец, это покрытие не будет полным, если мы не проиллюстрируем, как опубликовать обновление статуса в LinkedIn (в LinkedIn это называется «поделиться»).
private void TweetClick(object sender, RoutedEventArgs e) {
var share = @"<?xml version=""1.0"" encoding=""UTF-8""?>" +
"<share>" +
"<comment>Comment to share with the world</comment>" +
"<visibility>" +
"<code>anyone</code>" +
"</visibility>" +
"</share>";
var postUrl ="http://api.linkedin.com/v1/people/~/shares";
var request = CreateRequest("POST", postUrl);
request.BeginGetRequestStream(reqresult => {
var req = reqresult.AsyncState as HttpWebRequest;
using (var strm = req.EndGetRequestStream(reqresult))
using (var writer = new StreamWriter(strm)) {
writer.Write(share);
}
req.BeginGetResponse(result => {
try {
var req2 = result.AsyncState as HttpWebRequest;
if (req2 == null) throw new ArgumentNullException("result", "Request parameter is null");
using (var resp = req.EndGetResponse(result)) {
Dispatcher.BeginInvoke(() => MessageBox.Show("Tweeted!"));
}
}
catch {
Dispatcher.BeginInvoke(() => MessageBox.Show("Unable to tweet"));
}
}, req);
}, request);
}
Таким образом, у вас это есть — азы аутентификации, авторизации и публикации в LinkedIn из приложения Windows Phone.