如何硬编码google drive api的身份验证和授权部分?

时间:2018-01-12 08:42:52

标签: asp.net google-api google-drive-api google-oauth google-api-dotnet-client

目前我拥有用户授权的代码,然后才能使用 OAuth2 访问自己的Google Drives帐户中的文件,但是现在我想将身份验证部分和授权部分硬编码到源代码中 aspx.cs页面

有可能吗?我目前使用的语言是 ASPx 以及 C#。我将此using ASPSnippets.GoogleAPI;用于以下代码。

以下是使用客户端密码和客户端ID

的我的0Auth2的代码
protected void Page_Load(object sender, EventArgs e)
{
    GoogleConnect.ClientId = "client_id";
    GoogleConnect.ClientSecret = "client_secret";
    GoogleConnect.RedirectUri = Request.Url.AbsoluteUri.Split('?')[0];
    GoogleConnect.API = EnumAPI.Drive;
    if (!string.IsNullOrEmpty(Request.QueryString["code"]))
    {
        string code = Request.QueryString["code"];
        string json = GoogleConnect.Fetch("me", code);
        GoogleDriveFiles files = new JavaScriptSerializer().Deserialize<GoogleDriveFiles>(json);

        //Remove the deleted files.
        dlFiles.DataSource = files.Items.Where(i => i.Labels.Trashed == false);
        dlFiles.DataBind();
    }
    else if (Request.QueryString["error"] == "access_denied")
    {
        ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", "alert('Access denied.')", true);
    }
    else
    {
        GoogleConnect.Authorize("https://www.googleapis.com/auth/drive.readonly");
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定您想要硬代码的代码。

  1. 访问令牌(仅限一小时不值得硬编码)
  2. 刷新令牌(长期存在可以硬编码,但不是一个好主意,见下文)
  3. 客户端ID(是的,您可以对此进行硬编码。)
  4. 客户端密码(是的,您可以对此进行硬编码)
  5. 这种方式的工作方式是您请求用户访问并获得刷新令牌,您应该存储这些刷新令牌。如果用户想要再次登录,或者您需要再次访问其数据,则可以使用刷新令牌来请求新的访问令牌,并且您可以访问用户数据。

    假设您有一个这些刷新令牌的列表,您可以在应用程序中对它们进行硬编码以供日后使用。然而这是一个坏主意。刷新令牌可能会过期。

    1. 用户可以删除您的访问权限
    2. 六个月未使用的刷新令牌将自动过期
    3. 如果用户请求了超过50个刷新令牌,则较旧的令牌将停止工作
    4. 随机Google错误
    5. 由于这个原因,您的应用程序最好能够在需要时再次请求用户访问。

      这是使用google .net客户端库进行身份验证的代码,用于存储用户凭据。如果用户没有有效的刷新令牌,则会提示用户再次访问。

      private static UserCredential GetUserCredential(string clientSecretJson, string userName, string[] scopes)
          {
              try
              {
                  if (string.IsNullOrEmpty(userName))
                      throw new ArgumentNullException("userName");
                  if (string.IsNullOrEmpty(clientSecretJson))
                      throw new ArgumentNullException("clientSecretJson");
                  if (!File.Exists(clientSecretJson))
                      throw new Exception("clientSecretJson file does not exist.");
      
                  // These are the scopes of permissions you need. It is best to request only what you need and not all of them               
                  using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read))
                  {
                      string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                      credPath = Path.Combine(credPath, ".credentials/", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
      
                      // Requesting Authentication or loading previously stored authentication for userName
                      var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
                                                                               scopes,
                                                                               userName,
                                                                               CancellationToken.None,
                                                                               new FileDataStore(credPath, true)).Result;
      
                      credential.GetAccessTokenForRequestAsync();
                      return credential;
                  }
              }
              catch (Exception ex)
              {
                  throw new Exception("Get user credentials failed.", ex);
              }
          }
      

      存储这些凭据后,您无需再次提示用户进行访问。

      注意:如果您作为开发人员希望在您控制的Google云端硬盘帐户上共享信息,则应仅使用IMO服务帐户。不应使用服务帐户来访问私人用户数据。这就是Oauth2的用途。

      注意2:虽然您可以考虑将其放入配置文件中,但您可能会硬编码您的客户端ID和密码。或者像上面的例子一样使用客户端secrete json。

      从我的sample project

      中删除了代码

      服务帐户VS Oauth2

      如果文件位于用户Google云端硬盘帐户上,则需要访问权限。你将不得不要求他们访问,没有办法,它与客户端库无关,这就是Oauth的工作方式。如果您尝试访问用户拥有的私有数据,则需要他们的许可。

      如果您尝试访问自己控制的Google云端硬盘帐户,并希望授予所述用户访问该帐户中文件的权限,那么您应该使用服务帐户。您可以通过获取服务帐户电子邮件地址并与其共享目录来授予服务帐户访问您的Google云端硬盘帐户的权限。然后,服务帐户可以访问该目录。我在这里的另一个教程Google Drive with service accounts

      您可能会发现我的教程系列很有用Google Development for beginners此部分位于服务帐户Google Developer service accounts

答案 1 :(得分:0)

Tl; Dr 没有办法“硬编码认证部分”

您似乎试图绕过用户在Google服务器上输入用户名和密码。你不能这样做。 OAuth明确旨在阻止用户与您的网站共享其Google凭据:

enter image description here

Using OAuth 2.0 to Access Google APIs

请注意,用户将“用户登录和同意”输入 Google服务器,而非您的服务器。所有你看到的是令牌响应。这将为您提供访问该用户信息的窗口,但随后将过期,要求您获取新的令牌。所以你永远不会看到任何有用的硬编码信息。

系统明确设计为阻止您硬编码([sic])身份验证部分

如果您不想提示用户同意,您唯一的选择是使用Service Account。现在说,我认为Google驱动器不支持(理解)

This question涵盖了访问自己的驱动器以及如何实现这一目标。但是你不能这样做才能访问其他人的驱动器。