Как обменять код авторизации на access_token?

Я пытаюсь получить доступ к задачам Google с помощью OAuth 2.0 через DotNetOpenAuth и библиотека dotnet для Google Tasks.

Честно говоря, я немного озадачен всем процессом OAuth, но тем не менее.

Я пытаюсь следовать тому же процессу, что и игровая площадка OAuth2 в моем приложении: т.е.

  1. Пользователь нажимает ссылку для авторизации приложения
  2. Приложение использует DotNetOpenAuth для создания запроса в Google.
  3. Пользователь получает экран «Мое приложение хотело бы…» и авторизует приложение.
  4. Браузер перенаправлен на callback_uri с кодом авторизации
  5. Код обменивается на access_token
  6. Токен доступа используется в последующих запросах

Я пока не беспокоюсь о токенах обновления или о чем-то еще.

Итак, я дошел до шага 5 и застрял. Я просто не могу понять, как обменять код авторизации на токен доступа.

Я вызываю метод OAuthAuthenticator<T> (часть библиотеки Google Tasks) под названием LoadAccessToken, который звучит как правильный метод, но это приводит к следующей ошибке:

В сообщении
DotNetOpenAuth.OAuth2.Messages.AccessTokenAuthorizationCodeRequest отсутствовали следующие обязательные параметры: redirect_uri

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

Вот мой код:

public class AuthController : Controller
{
    private const string clientId = "xxxx";
    private const string secret = "xxxx";

    public ActionResult Authenticate()
    {
        UserAgentClient consumer = new UserAgentClient(GoogleAuthenticationServer.Description, clientId, secret);
        IAuthorizationState state = new AuthorizationState(new[] { TasksService.Scopes.Tasks.GetStringValue() });
        state.Callback = new Uri(Url.Action("OAuthCallback","Auth",null,"http"));
        var request = consumer.RequestUserAuthorization(state);
        return Redirect(request.ToString());
    }

    public ActionResult OAuthCallback(string code)
    {
        UserAgentClient consumer = new UserAgentClient(GoogleAuthenticationServer.Description, clientId, secret);
        OAuth2Authenticator<UserAgentClient> authenticator = new OAuth2Authenticator<UserAgentClient>(consumer, ProcessAuth);

        IAuthorizationState state = new AuthorizationState(new[] { TasksService.Scopes.Tasks.GetStringValue() });
        state.Callback = new Uri(Url.Action("OAuthSuccess", "Auth", null, "http"));
        authenticator.LoadAccessToken();

        return RedirectToAction("List","Home");
    }

    public ActionResult OAuthSuccess(string access_token)
    {
        Session["token"] = access_token;
        return RedirectToAction("List", "Home");
    }

    private IAuthorizationState ProcessAuth(UserAgentClient arg)
    {
        var state = arg.ProcessUserAuthorization(Request.Url);
        return state;
    }
}

Любые идеи?


person Rob Stevenson-Leggett    schedule 25.03.2013    source источник


Ответы (2)


ознакомьтесь с документацией для пример использования кода DotNet.OAuth2. У него есть отличный пример, чтобы показать вам, как настроить танец OAuth.

person Mark S.    schedule 25.03.2013

Этот пример может быть ближе к тому, что вы пытаетесь сделать. http://www.limilabs.com/blog/oauth2-gmail-imap-web-applications

person Adam Larsen    schedule 14.05.2013