Google Linux 无头服务器 (.NET) 上的 OAuth2 授权

Google OAuth2 Authorization On Linux Headless Server (.NET)

我很好奇 Linux 无头服务器上的身份验证如何在没有 C# 中的互联网浏览器的情况下为他们的 Sheetsv4 API 工作。他们在入门页面上的所有代码片段都引用了 GoogleWebAuthorizationBroker,如果没有网络浏览器,它就无法工作。我看到了对 GoogleAuthorizationCodeFlow 的引用,但我不确定这是否是我正在寻找的 - 也不确定您打算如何使用它。我当前的代码如下-

UserCredential Credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(Stream).Secrets,
    new string[1] { SheetsService.Scope.SpreadsheetsReadonly },
    "user",
    CancellationToken.None,
    new FileDataStore(GreetFurConfiguration.TokenFile, true)
).Result;

我想要的是生成 link 并从那里能够将令牌粘贴到控制台中,就像其他 Google APIs 处理我以前使用过的这种身份验证(Go,NodeJS)并且似乎运行良好。

如果有任何更好的方法来处理此身份验证,尽管它更适合 .NET 工作流,那也是合适的。尽管无法访问主机上的 Web 浏览器,但我无法找到任何关于如何在我的生活中获得 OAuth2 令牌的示例。

编辑:我会寻找 https://github.com/googleapis/google-api-dotnet-client/blob/master/Src/Support/Google.Apis.Auth/OAuth2/PromptCodeReceiver.cs

但是,我找不到任何关于如何使用它的文档 class。

GoogleWebAuthorizationBroker.AuthorizeAsync 允许您发送您想要的代码接收器 您正在寻找的是 PromptCodeReceiver

    private const string PathToCredentialFile = "/home/linda/development/creds/client.json";
    
            static async Task Main(string[] args)
            {
                var scope = new[] {AnalyticsReportingService.Scope.AnalyticsReadonly};
                var credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
                
                await using (var stream = new FileStream(PathToCredentialFile, FileMode.Open, FileAccess.Read))
                {
                    // Requesting Authentication or loading previously stored authentication for userName
                    var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
                        scope,
                        "userName",
                        CancellationToken.None,
                        new FileDataStore(credPath, true),
                        new PromptCodeReceiver()).Result;
    
                    Console.WriteLine($"AccessToken: {credential.Token.AccessToken}");
                }

输出:

Please visit the following URL in a web browser, then enter the code shown after authorization:
https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&client_id=1XXXXX.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly

Please enter code: 
4/1AY0e-g6L3ASB0lEhWNkh4lDc4nl5k0xV177o38taWFzEzKBv3H24ZC4zQAM
Access toekn: ya29.a0AfH6SMB8ZhpZJgKkpMfbiflxeOF_o6Gzs6fxIuPI25Vewbp7NgVAfJp8EX6K5zgielRrYaSFjqwKIY8MoCuCDbPeF5-2w6_WRnauWqtpleqk2zjqmkHgpfNwbpO8n7VmHVSF9Mgn3YOZRl