当从某些应用程序调用Google OAuth方法AuthorizeAsync时挂起

本文关键字:方法 OAuth AuthorizeAsync 挂起 Google 调用 应用程序 | 更新日期: 2023-09-27 18:09:05

我编写了一个c#库,提供了一些辅助函数来访问Google Drive。

服务构造函数按如下方式调用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" />

欢迎指教

当从某些应用程序调用Google OAuth方法AuthorizeAsync时挂起

代码不工作,因为应用程序托管在IIS上。IIS访问%appdata%文件夹中的文件夹时可能有问题。默认情况下,令牌文件保存在%appdata%文件夹中。我试过更改那个文件夹的权限。我添加了Everyone,DefaultAppPool,I_USER,…但没有成功。谷歌也有更新的版本。api(1.8.2)允许全路径(new FileDataStore(fullPath,true)) true意味着全路径,但即使在那里也有bug。不可能使用那个构造函数,因为我总是得到错误。所以我决定我的应用程序应该使用IIS Express(事实上,我创建了一个带有授权代码的新项目)。进入解决方案属性并设置应用程序使用IIS Express。

从https://console.developers.google.com(选择web应用程序)获取clientdid (json文件),并设置http://localhost:48372(或任何你的应用程序端口使用)为javascript起源和http://localhost:48372/授权。Aspx用于重定向url。您还应该在互联网上找到如何将端口设置为静态的)。保存您的clientId文件。(这一步你可能已经做过了)当您使用IIS express时,AuthorizeAsync方法应该没有问题。您将被提示输入您的凭据并选择您的youtube帐户(或仅选择帐户,如果您已经登录)。当你给你的应用程序权限时,你会被重定向到authorization .aspx。您的授权aspx页面应该创建新的IAuthorization流对象,并提供客户端秘密属性和数据存储属性。使用code= Request从URL读取代码。参数["code"]并创建UserCredential对象。youtubeService的HttpClientInitializer属性是UserCredential类型的。您应该使用的方法类似于var usercredential= flow. somemethodwherereceives ("user",code,CancelletionToken.None)。之后,包含刷新令牌的文件将在您指定的FileDataStore文件夹中生成。当你有了你的刷新令牌,你可以做任何你想做的事情,因为刷新令牌应该永远持续下去(除非手动撤销)。有一种方法允许从refreshtoken获取usercredential,例如flow.getAccessTokenfromRefreshToken("user","your_refresh_token_string")所以,当你有你的刷新令牌和使用方法最后一个方法,你将能够访问谷歌youtube api。你也有可能得到其他用户上传到你的youtube帐户使用这种方法。如果你对用户放在你的账户上的内容保守,你可以总是把他们上传的视频设置为私有,并在验证后将其更改为公共。

google youtube api中的一些方法需要OAUTH2认证(从客户端secret获取刷新令牌->从刷新令牌获取访问令牌…),例如上传视频,但像getvideos这样的方法不需要。你可以提供API key给你的youtubeService构造函数而不是UserCredential

编辑:还有一个我忘记提到的问题(对于那些认为这就是全部的人)。当你给你的应用程序权限访问谷歌api(就在你被重定向到authorization .aspx之前),你会得到错误redirect_url不匹配,因为在url参数redirect_url的某个地方不匹配你在ClientId json中提供的重定向url,(端口是不同的,至少,出于某种原因)。更改此参数,使其与您在clientId json中提供的重定向url相匹配。