Доступ к Документам Google с помощью GData - PullRequest
1 голос
/ 19 сентября 2011

Рабочая платформа: ASP.NET 4.0 C # (Framework Agnostic)

Google GData - моя зависимость

using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Documents;

У меня есть две страницы Auth и List.

Аутентификация перенаправляет на сервер Google следующим образом

public ActionResult Auth()
{
    var target = Request.Url.ToString().ToLowerInvariant().Replace("auth", "list");
    var scope = "https://docs.google.com/feeds/";
    bool secure = false, session = true;

    var authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
    return new RedirectResult(authSubUrl);
}

Теперь он достигает страницы списка, если аутентификация прошла успешно.

public ActionResult List()
{
    if (Request.QueryString["token"] != null)
    {
        String singleUseToken = Request.QueryString["token"];

        string consumerKey = "www.blahblah.net";
        string consumerSecret = "my_key";
        string sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null).ToString(); 

        var authFactory = new GOAuthRequestFactory("writely", "qwd-asd-01");
        authFactory.Token = sessionToken;
        authFactory.ConsumerKey = consumerKey;
        authFactory.ConsumerSecret = consumerSecret;
        //authFactory.TokenSecret = "";
        try
        {
            var service = new DocumentsService(authFactory.ApplicationName) { RequestFactory = authFactory };

            var query = new DocumentsListQuery();
            query.Title = "project";

            var feed = service.Query(query);
            var result = feed.Entries.ToList().ConvertAll(a => a.Title.Text);
            return View(result);
        }
        catch (GDataRequestException gdre)
        {
            throw;
        }
    }
}

Ошибка в строке var feed = service.Query(query); с ошибкой

Не удалось выполнить запрос: https://docs.google.com/feeds/default/private/full?title=project

HttpStatusCode получено на блоке улова HttpStatusCode.Unauthorized

Что не так с этим кодом? Нужно ли мне получать TokenSecret? Если да, то как?

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Использовал 3-сторонний OAuth в клиентских библиотеках протокола данных Google

Пример кода

string CONSUMER_KEY = "www.bherila.net";
string CONSUMER_SECRET = "RpKF7ykWt8C6At74TR4_wyIb";
string APPLICATION_NAME = "bwh-wssearch-01";

string SCOPE = "https://docs.google.com/feeds/";

public ActionResult Auth()
{
    string callbackURL = String.Format("{0}{1}", Request.Url.ToString(), "List");
    OAuthParameters parameters = new OAuthParameters()
    {
        ConsumerKey = CONSUMER_KEY,
        ConsumerSecret = CONSUMER_SECRET,
        Scope = SCOPE,
        Callback = callbackURL,
        SignatureMethod = "HMAC-SHA1"
    };

    OAuthUtil.GetUnauthorizedRequestToken(parameters);
    string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters);
    Session["parameters"] = parameters;
    ViewBag.AuthUrl = authorizationUrl;
    return View();
}

public ActionResult List()
{
    if (Session["parameters"] != null)
    {
        OAuthParameters parameters = Session["parameters"] as OAuthParameters;
        OAuthUtil.UpdateOAuthParametersFromCallback(Request.Url.Query, parameters);

        try
        {
            OAuthUtil.GetAccessToken(parameters);

            GOAuthRequestFactory authFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);

            var service = new DocumentsService(authFactory.ApplicationName);
            service.RequestFactory = authFactory;

            var query = new DocumentsListQuery();
            //query.Title = "recipe";

            var feed = service.Query(query);
            var docs = new List<string>();
            foreach (DocumentEntry entry in feed.Entries)
            {
                docs.Add(entry.Title.Text);
            }
            //var result = feed.Entries.ToList().ConvertAll(a => a.Title.Text);
            return View(docs);
        }
        catch (GDataRequestException gdre)
        {
            HttpWebResponse response = (HttpWebResponse)gdre.Response;

            //bad auth token, clear session and refresh the page
            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                Session.Clear();
                Response.Write(gdre.Message);
            }
            else
            {
                Response.Write("Error processing request: " + gdre.ToString());
            }
            throw;
        }
    }
    else
    {
        return RedirectToAction("Index");
    }
}

Этот двуногий образец никогда не работал для меня в Google Docs.

1 голос
/ 19 сентября 2011

Вам необходимо запросить токен у Google и использовать его для инициализации вашего экземпляра DocumentsService.

Вот пример использования Google ContactsService.Это должно быть то же самое для DocumentsService.

Service service = new ContactsService("My Contacts Application");
service.setUserCredentials("your_email_address_here@gmail.com", "yourpassword");
var token = service.QueryClientLoginToken();
service.SetAuthenticationToken(token);

Но, как вы упомянули, вы используете AuthSub.Я бросил пистолет слишком быстро.

Я вижу, что вы запрашиваете жетон сеанса.Согласно документации API, вы должны использовать токен сеанса для аутентификации запросов к сервису, поместив токен в заголовок авторизации.После настройки токена сеанса вы можете использовать клиентскую библиотеку API данных Google.

Вот полный пример (от Google) о том, как использовать AuthSub с клиентской библиотекой .NET:

http://code.google.com/intl/nl-NL/apis/gdata/articles/authsub_dotnet.html

Позвольте мне включить сокращенный пример:

GAuthSubRequestFactory authFactory = 
    new GAuthSubRequestFactory("cl", "TesterApp");
authFactory.Token = (String) Session["token"];
CalendarService service = new CalendarService(authFactory.ApplicationName);
service.RequestFactory = authFactory;

EventQuery query = new EventQuery();

query.Uri = new Uri("http://www.google.com/calendar/feeds/default/private/full");

EventFeed calFeed = service.Query(query);
foreach (Google.GData.Calendar.EventEntry entry in calFeed.Entries)
{
    //...
}

И если я правильно вижу, ваш пример кода довольно точно выполняет те же шаги, за исключением того, что вы устанавливаете ConsumerKey и ConsumerSecret дляAuthFactory, который не сделан в примере Google.

...