Правильная аутентификация для доступа к контактам Google... (C#/MVC3)
У меня есть очень простое приложение MVC на данный момент:
контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome!";
var qs = HttpContext.Request.QueryString;
var keys = qs.AllKeys.ToList();
if (keys.Count > 0 && keys.Contains("token"))
{
Session["token"] = qs.Get("token");
Models.GoogleContact gc = new Models.GoogleContact();
}
else
{
ViewBag.GoogleUrl = AuthSubUtil.getRequestUrl(HttpContext.Request.Url.AbsoluteUri, "https://www.google.com/m8/feeds/", false, true);
}
return View();
}
public ActionResult About()
{
return View();
}
}
У меня есть это Home View:
@{
ViewBag.Title = "Home Page";
}
<p>Home Page...</p>
<a href="@ViewBag.GoogleUrl">Tie in with Google</a>
<br />
<br />
Когда приложение запускается впервые, строка запроса отсутствует, поэтому Контроллер создаст ссылку, которую я вставил на Домашнюю страницу. Вы нажимаете на ссылку, и она отправляет вас в Google. Подтвердите, что вы хотите, чтобы это приложение имело доступ к контактам Google, и оно возвращается со строкой запроса на домашнюю страницу. Контроллер видит строку запроса, удаляет токен и создает экземпляр класса Google "Модель".
Базовый класс:
internal class baseGoogle
{
#region Private Properties
internal const string googleContactToken = "cp";
internal const string googleCalendarToken = "cl";
internal string _authSubToken;
internal GAuthSubRequestFactory _gAuthSubRequestFactory;
internal RequestSettings _requestSettings;
internal ContactsRequest _contactsRequest;
internal ContactsService _contactsService;
#endregion
internal baseGoogle()
{
#if DEBUG
_authSubToken = HttpContext.Current.Session["token"].ToString();
_gAuthSubRequestFactory = new Google.GData.Client.GAuthSubRequestFactory(googleContactToken, "Tester1");
_requestSettings = new Google.GData.Client.RequestSettings(_gAuthSubRequestFactory.ApplicationName, _authSubToken);
_contactsRequest = new Google.Contacts.ContactsRequest(_requestSettings);
_contactsService = new Google.GData.Contacts.ContactsService(_gAuthSubRequestFactory.ApplicationName);
_contactsService.RequestFactory = _gAuthSubRequestFactory;
#endif
}
}
Мой класс контактов Google:
internal class GoogleContact : baseGoogle
{
#region Public Properties
[NotMapped]
public Dictionary<string, Group> Groups { get; set; }
#endregion
public GoogleContact() : base()
{
// Get the list of contact groups...
_requestSettings.AutoPaging = true;
Feed<Group> fg = _contactsRequest.GetGroups();
foreach (Group g in fg.Entries)
{
this.Groups.Add(g.Title, g);
}
}
}
Кажется, все работает нормально, пока я не попробую перебрать элементы Feed. В этот момент появляется 401 - Несанкционированная ошибка.
Есть идеи, почему он это делает? Я слежу за документами по Google Dev.
Я использую версию API 1.7.0.1.
ПРИМЕЧАНИЕ: я нашел запись в блоге с другим кодом и думаю, что это работает. Теперь, чтобы выяснить, почему полуофициальный способ не работает! У кого-нибудь есть идеи?
1 ответ
После долгих тренировок я обнаружил один способ выполнить то, что мне было нужно. Во-первых, я не смог найти способ использовать токен авторизации OpenID, чтобы получить доступ к контактам пользователей, календарю и т. Д. Я все еще ищу способ сделать это. ( см мой вопрос здесь)
Я понял, что человек должен ввести свое имя пользователя и пароль Google в своем профиле, а затем использовать его для подключения к своей информации через GData. Я чувствую, что большинство людей не захотят делать это! (И это довольно избыточно!)
Вот код, который я придумал:
using System;
using System.Collections.Generic;
using System.Linq;
using Google.GData.Contacts;
using Google.GData.Extensions;
namespace myNameSpace
{
///
/// Summary description for GoogleContactService
///
public class GoogleContactService
{
#region Properties
public static ContactsService GContactService = null;
#endregion
#region Methods
public static void InitializeService(string username, string password)
{
GContactService = new ContactsService("Contact Infomation");
GContactService.setUserCredentials(username, password);
}
public static List<ContactDetail> GetContacts(string GroupName = null)
{
List<ContactDetail> contactDetails = new List<ContactDetail>();
ContactsQuery contactQuery = new ContactsQuery(ContactsQuery.CreateContactsUri("default"));
contactQuery.NumberToRetrieve = 1000;
if (!String.IsNullOrEmpty(GroupName))
{
GroupEntry ge = GetGroup(GroupName);
if (ge != null)
contactQuery.Group = ge.Id.AbsoluteUri;
}
else
{
string groupName = "";
GroupEntry ge = GetGroup(groupName);
if (ge != null)
contactQuery.Group = ge.Id.AbsoluteUri;
}
ContactsFeed feed = GContactService.Query(contactQuery);
foreach (ContactEntry entry in feed.Entries)
{
ContactDetail contact = new ContactDetail
{
Name = entry.Title.Text,
EmailAddress1 = entry.Emails.Count >= 1 ? entry.Emails[0].Address : "",
EmailAddress2 = entry.Emails.Count >= 2 ? entry.Emails[1].Address : "",
Phone1 = entry.Phonenumbers.Count >= 1 ? entry.Phonenumbers[0].Value : "",
Phone2 = entry.Phonenumbers.Count >= 2 ? entry.Phonenumbers[1].Value : "",
Address = entry.PostalAddresses.Count >= 1 ? entry.PostalAddresses[0].FormattedAddress : "",
Details = entry.Content.Content
};
contact.UserDefinedFields = new List<UDT>();
foreach ( var udt in entry.UserDefinedFields)
{
contact.UserDefinedFields.Add(new UDT { Key = udt.Key, Value = udt.Value });
}
contactDetails.Add(contact);
}
return contactDetails;
}
#endregion
#region Helpers
private static GroupEntry GetGroup(string GroupName)
{
GroupEntry groupEntry = null;
GroupsQuery groupQuery = new GroupsQuery(GroupsQuery.CreateGroupsUri("default"));
groupQuery.NumberToRetrieve = 100;
GroupsFeed groupFeed = GContactService.Query(groupQuery);
foreach (GroupEntry entry in groupFeed.Entries)
{
if (entry.Title.Text.Equals(GroupName, StringComparison.CurrentCultureIgnoreCase))
{
groupEntry = entry;
break;
}
}
return groupEntry;
}
#endregion
}
public class ContactDetail
{
public string Name { get; set; }
public string EmailAddress1 { get; set; }
public string EmailAddress2 { get; set; }
public string Phone1 { get; set; }
public string Phone2 { get; set; }
public string Address { get; set; }
public string Details { get; set; }
public string Pipe { get; set; }
public string Relationship { get; set; }
public string Status { get; set; }
public List<UDT> UserDefinedFields { get; set; }
}
public class UDT
{
public string Key { get; set; }
public string Value { get; set; }
}
}
Теперь, чтобы понять, как использовать их OpenID логин вместо того, чтобы запрашивать их регистрационные данные!