0

我正在尝试通过 DotNetOpenAuth 和Google Tasks 的 dotnet 库使用 OAuth 2.0 访问 Google Tasks

老实说,我对整个 OAuth 过程有点困惑,但无论如何。

我正在尝试遵循 OAuth2 游乐场在我的应用程序中经历的相同过程:即

  1. 用户点击链接授权应用
  2. 应用使用 DotNetOpenAuth 构造对 Google 的请求
  3. 用户看到“我的应用程序想要..”屏幕并授权应用程序
  4. 浏览器重定向到带有授权码的 callback_uri
  5. 代码换取access_token
  6. 访问令牌用于后续请求

我还不担心刷新令牌或任何事情。

所以我到了第5步并且被卡住了。我只是不知道如何用授权码交换访问令牌。

我正在调用OAuthAuthenticator<T>(Google Tasks lib 的一部分)上的一个方法,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;
    }
}

有任何想法吗?

4

2 回答 2

1

这个例子可能更接近你想要做的。 http://www.limilabs.com/blog/oauth2-gmail-imap-web-applications

于 2013-05-14T04:07:59.363 回答
1

查看文档以获取有关如何使用 DotNet.OAuth2 代码的示例。它有一个很好的示例向您展示如何获得 OAuth 舞蹈设置。

于 2013-03-25T15:13:44.980 回答