Google / OAuth 2 - автоматический вход - PullRequest
5 голосов
/ 06 июня 2011

Я немного играю с OAuth 2.0 в сочетании с некоторыми API Google.Хотя процесс авторизации довольно прост, я сталкиваюсь с проблемой автоматической авторизации после завершения начальной авторизации.

Итак:

1. Authorization is done for the first time. (user grants access, I get the token etc etc)
2. User exits the application
3. User starts the application again
4. How to logon automatically here?

Припункт 4, у меня есть refresh_token, поэтому я должен просто запросить новый токен, используя этот request_token.Но я все еще продолжаю получать 401 несанкционированных результатов по моим звонкам.

Так что я пытаюсь сделать так, чтобы мое приложение могло входить в систему без вывода сообщений, чтобы пользователю не приходилось каждый раз предоставлять доступ.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Вы должны иметь возможность обновить токен OAuth 2.0, используя следующий запрос:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

client_id=21302922996.apps.googleusercontent.com&
client_secret=XTHhXh1SlUNgvyWGwDk1EjXB&
refresh_token=1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ&
grant_type=refresh_token

Как указано в Документация Google OAuth 2.0 .

Я только что попробовал егос помощью curl, и он работает как ожидалось:

curl -d client_id=$CLIENT_ID -d client_secret=$CLIENT_SECRET -d refresh_token=$REFRESH_TOKEN -d grant_type=refresh_token https://accounts.google.com/o/oauth2/token

{"access_token":"$ACCESS_TOKEN","token_type":"Bearer","expires_in":3600}
1 голос
/ 22 октября 2011

Я делаю это в .NET с помощью Google.GData.Client.После того, как я прошел процесс авторизации и сохранил токены, в следующий раз, когда мой пользователь придет на сайт, я получу авторизацию, сгенерировав объект GOAuthRequestFactory.

public GOAuthRequestFactory GetGoogleOAuthFactory(int id)
    {
        // build the base parameters
        OAuthParameters parameters = new OAuthParameters
        {
            ConsumerKey = kConsumerKey,
            ConsumerSecret = kConsumerSecret
        };

        // check to see if we have saved tokens and set
        var tokens = (from a in context.GO_GoogleAuthorizeTokens where a.id = id select a);
        if (tokens.Count() > 0)
        {
            GO_GoogleAuthorizeToken token = tokens.First();
            parameters.Token = token.Token;
            parameters.TokenSecret = token.TokenSecret;
        }

        // now build the factory
        return new GOAuthRequestFactory("somevalue", kApplicationName, parameters);
    }

Как только у меня будет фабрика запросов, яможет вызвать один из различных API, которые я имею право использовать, и сделать что-то вроде этого:

// authenticate to the google calendar
CalendarService service = new CalendarService(kApplicationName);
service.RequestFactory = GetGoogleOAuthFactory([user id]);

// add from google doc record
EventEntry entry = new EventEntry();
entry.Title.Text = goEvent.Title;
entry.Content.Content = GoogleCalendarEventDescription(goEvent);

When eventTime = new When(goEvent.StartTime, goEvent.EndTime.HasValue ? goEvent.EndTime.Value : DateTime.MinValue, goEvent.AllDay);
entry.Times.Add(eventTime);

// add the location
Where eventLocation = new Where();
eventLocation.ValueString = String.Format("{0}, {1}, {2} {3}", goEvent.Address, goEvent.City, goEvent.State, goEvent.Zip);
entry.Locations.Add(eventLocation);

Uri postUri = new Uri(kCalendarURL);

// set the request and receive the response
EventEntry insertedEntry = service.Insert(postUri, entry);
...