Я пытаюсь получить доступ к задачам Google с помощью OAuth 2.0 через DotNetOpenAuth и библиотека dotnet для Google Tasks.
Честно говоря, я немного озадачен всем процессом OAuth, но тем не менее.
Я пытаюсь следовать тому же процессу, что и игровая площадка OAuth2 в моем приложении: т.е.
- Пользователь нажимает ссылку для авторизации приложения
- Приложение использует DotNetOpenAuth для создания запроса в Google.
- Пользователь получает экран «Мое приложение хотело бы…» и авторизует приложение.
- Браузер перенаправлен на callback_uri с кодом авторизации
- Код обменивается на access_token
- Токен доступа используется в последующих запросах
Я пока не беспокоюсь о токенах обновления или о чем-то еще.
Итак, я дошел до шага 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;
}
}
Любые идеи?