c# - 从某些应用程序调用时,Google OAuth 方法 AuthorizeAsync 挂起

标签 c# google-drive-api google-oauth

我有一个我编写的 C# 库,它提供了一些辅助函数来访问 Google 云端硬盘。

服务构造函数调用 AuthorizeAsync 如下:

// get access token
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, Scopes, key, CancellationToken.None, storageService).Result;

我已经为此编写了单元测试,并且在从单元测试系统运行时测试有效。我还在 Windows 服务中使用过它,它再次运行良好。我知道这段代码有效。

我现在尝试在具有更多 DLL 和引用的旧应用程序中使用它,当我调用该方法时它只是挂起并且没有引发异常。

我强烈怀疑是某处的DLL冲突,但没有异常或编译错误,不可能知道要更改什么。

API 版本:

  <package id="Google.Apis" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Auth" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Core" version="1.8.2" targetFramework="net45" />
  <package id="Google.Apis.Drive.v2" version="1.8.1.1270" targetFramework="net45" />

相关库:

  <package id="log4net" version="2.0.3" targetFramework="net45" />
  <package id="Microsoft.Bcl" version="1.1.9" targetFramework="net45" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
  <package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net45" />

欢迎任何指点..

最佳答案

代码无法运行,因为应用托管在 IIS 上。 IIS 访问 %appdata% 文件夹内的文件夹时可能存在问题。 token 文件默认保存在 %appdata% 文件夹中。我尝试更改对该文件夹的权限。我添加了 Everyone,DefaultAppPool,I_USER,... 但没有成功。还有较新版本的 Google.Apis (1.8.2) 允许完整路径( new FileDataStore(fullPath,true) ) true 表示完整路径,但即使在那里也有错误。无法使用该构造函数,因为我总是出错。所以我决定我的应用程序应该使用 IIS Express(事实上我创建了一个带有授权代码的新项目)。转到解决方案属性并将您的应用程序设置为使用 IIS Express。

https://console.developers.google.com获取cliendId(json文件) (选择 Web 应用程序)并为 javascript 来源设置 http://localhost:48372(或您的应用程序使用的任何端口),为重定向 URL 设置 http://localhost:48372/authorize.aspx。您还应该在互联网上找到如何使您的端口静态)。保存您的 clientId 文件。 (这一步你可能已经做过了) 当您使用 IIS Express 时, AuthorizeAsync 方法应该没有问题。系统将提示您输入您的凭据并选择您的 youtube 帐户(如果您已经登录,则只需选择帐户)。当您授予您的应用程序权限时,您将被重定向到 authorize.aspx。您的 aspx 授权页面应该使用提供的 Client Secret 属性和 DataStore 属性创建新的 IAuthorization 流对象。使用 code= Request.Params["code"] 从 URL 读取代码并创建 UserCredential 对象。youtubeService 的 HttpClientInitializer 属性属于 UserCredential 类型。您应该使用的方法类似于 var usercredential= flow.SomeMethodWhichReceives("user",code,CancelletionToken.None)。之后,包含刷新 token 的文件会在您指定的 FileDataStore 文件夹中生成。 当您拥有刷新 token 时,您可以做任何您想做的事情,因为刷新 token 应该永远有效(除非手动撤销)。有一种方法允许从 refreshtoken 获取用户凭证,例如 flow.getAccessTokenfromRefreshToken("user","your_refresh_token_string") 因此,当您拥有刷新 token 并使用最后一种方法时,您将能够访问 google youtube api。您也有可能使用此方法将其他用户上传到您的 YouTube 帐户。如果您对用户在您帐户中放置的内容感到放心,您始终可以将他们上传的视频设为私有(private),并在验证时将其更改为公开。

google youtube api 中的某些方法需要 OAUTH2 身份验证(从客户端密码获取刷新 token -> 从刷新 token 获取访问 token ...),例如上传视频,但有些方法如 getvideos 不需要。您可以向 youtubeService 构造器提供 API key 而不是 UserCredential

编辑:还有一个问题我忘了提(对于那些认为这就是全部的人)。当您授予您的应用程序访问 google api 的权限时(就在您被重定向到 authorize.aspx 之前),您将收到错误 redirect_url mismatch,因为 url parametar redirect_url 中的某处与您在 ClientId 中提供的重定向 url 不匹配json,(端口不同,至少,出于某种原因)。更改此参数,使其与您在 clientId json 中提供的重定向 URL 相匹配。

关于c# - 从某些应用程序调用时,Google OAuth 方法 AuthorizeAsync 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289428/

相关文章:

c# - 在单击 RadioButton 之前保持按钮不可见 c#

java - 如何从没有浏览器的服务器访问 Google Drive 文档

java - 如何通过 Android 的 Drive API 读取 Google 表格内容?

javascript - 如何使用Google Identity Services JS SDK进行授权?

go - 服务器端 oauth : What to do with the tokens received

c# - 将 UIImage 转换为流

c# - 在 C# 中重用 C 中的结构

c# - 为什么在 C# 中,从函数参数引用变量比从私有(private)属性引用变量更快?

java - 转换为间接子类

go - 在 Go 中使用 google oauth2