DotNetOpenAuth およびGoogle Tasks の dotnet ライブラリを介して OAuth 2.0 を使用して Google Tasks にアクセスしようとしています。
正直なところ、私は OAuth プロセス全体に少し困惑していますが、とにかく.
OAuth2 プレイグラウンドがアプリで通過するのと同じプロセスに従おうとしています:
- ユーザーがリンクをクリックしてアプリを承認する
- アプリは DotNetOpenAuth を使用して Google へのリクエストを作成します
- ユーザーに「My application would like to..」画面が表示され、アプリを承認します。
- 認証コードを含む 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;
}
}
何か案は?