Google OAuth使用javascript生成的OAuth access_token获取刷新令牌

时间:2013-11-07 00:25:18

标签: c# oauth-2.0 google-calendar-api google-oauth

我正在开发应用程序,我需要代表用户对google API执行服务器端请求。

在基本术语中,我的应用程序执行此操作: 使用gapi javascript library请求身份验证并获取access_token 这个令牌的问题是它的短暂存在,并且我无法扩展它,只要我可以告诉使用javascript google apis。 现在我的问题是拥有那个短暂的令牌,我如何使用服务器端SDK(在我的情况下是c#)或直接WebClient连接来请求长期存在(refresh_token)?

当客户端身份验证完成后,我有这些数据:

function handleAuthResult(authResult) {

  if (authResult && !authResult.error) {
    //Authentication successful
    //authResults.access_token - has a valid token that expires in 60 minutes
    //Say token set to this:ya29.AHES6ZRadMF0y*********c8GOC8KYZFkc6q1fCeT_Q
    //Now I can send it using ajax to the server handler to try to extend
  } else {
    $("#google-cal-authorize-button").button("enable");
  }
}

因此,一旦令牌可用,我正试图在服务器上扩展它,它失败我必须做错事 以下来自https://developers.google.com/accounts/docs/OAuth2WebServer#offline的示例 使用WebClient

        WebClient wc_ = new WebClient();
        NameValueCollection prms = new NameValueCollection();

        prms["client_id"] = "91884************n4v.apps.googleusercontent.com";
        prms["client_secret"] = "cANBL0*********lMK4";
        prms["refresh_token"] = "ya29.AHES6ZRadMF0y*********c8GOC8KYZFkc6q1fCeT_Q";
        prms["grant_type"] = "refresh_token";

        wc_.UploadValuesCompleted += (object sender, UploadValuesCompletedEventArgs e) =>
        {


        };

        wc_.Headers.Add("Content-type", "application/x-www-form-urlencoded");

        byte[] response = wc_.UploadValues(new Uri("https://accounts.google.com/o/oauth2/token"), "POST", prms);

此外,我可以在服务器端访问Google.Apis Beta v1.5 http://www.nuget.org/packages/Google.Apis/1.5.0-beta,但无法找到有关如何结合使用这两个库的示例。

因此,如果有人可以提供有关如何扩展客户端生成的短期access_token在服务器上的样本将是很好的。如果可能的话。

1 个答案:

答案 0 :(得分:1)

您无法扩展客户端生成的短期access_token"。这不是oauth的工作方式。

您可以采取两种方法: -

  1. 您可以每小时使用Javascript获取一个新的访问令牌。如果您不强制提示,则用户将无法看到此提示。如果要将访问令牌传递给服务器应用程序以供其使用,请继续。请参阅https://developers.google.com/accounts/docs/OAuth2UserAgent
  2. 如果您确实需要刷新令牌,则需要在请求授权时明确请求(type = offline)。这只能在服务器上完成。然后,您的服务器可以将访问令牌传递给javascript客户端,或者您的客户端可以愉快地继续请求自己的访问令牌。请参阅https://developers.google.com/accounts/docs/OAuth2WebServer