我有一个GCloud部署的appengine受Google的身份识别代理(IAP)保护,并希望进行服务器到服务器的通信,以便使用dotnet从应用程序中检索URL(在本例中为F#)。所有谷歌的例子都是google apis而不是appengine页面,我在.Net中找不到任何内容。我下面的基本F#(API调用与你为C#做的相同)设法设置服务凭证并检索令牌,但是拉动应用程序的主页(不需要进一步的auth)会返回下面的错误。我认为它至少部分正确,因为早先尝试提供持票人令牌错误地登陆谷歌登录页面而不是应用程序。我已将服务帐户添加到授权用户列表中。 The closest google example is in Python并使用两步过程,但api调用与dotnet库不同。对调试或修复的建议表示赞赏,
未处理的异常:System.AggregateException:一个或多个错误 发生了。 (响应状态代码不表示成功:401 (未经授权)。)---> System.Net.Http.HttpRequestException:响应 状态代码不表示成功:401(未授权)。在 System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()at System.Net.Http.HttpClient.d__27.MoveNext()
open Google.Apis.Auth
open Google.Apis.Requests
open Google.Apis.Http
open Google.Apis.Oauth2.v2
open Google.Apis.Auth.OAuth2
open System.IO
open System
open Google.Apis.Auth.OAuth2
open System
open System.Threading.Tasks
open Giraffe.Tasks
open System.Security.Cryptography.X509Certificates
open Google.Apis.Auth.OAuth2
open Google.Apis.Services
open System.Security.Cryptography
open System.Net.Http.Headers
let test() =
printfn "inial service account credentials from json"
use jsonStream = new StreamReader("c:/<path to json credentials>.json")
let credential = ServiceAccountCredential.FromServiceAccountData(jsonStream.BaseStream)
let t =
task {
printfn "Get access token"
// Is this the right auth_uri?
let! token = credential.GetAccessTokenForRequestAsync("https://www.googleapis.com/oauth2/v4/token")
let auth = AuthenticationHeaderValue("Bearer",token)
credential.HttpClient.DefaultRequestHeaders.Authorization<-auth
// This access to an Identity aware proxy protected appengine page access to an Identity aware proxy throws a 401
let! homePage = credential.HttpClient.GetStringAsync("https://<myapp>.appspot.com")
printfn "%s" homePage
}
t.Wait()
()
答案 0 :(得分:1)
直到5分钟前,几乎不可能弄明白,因为没有.NET样本或文档。但是,是的, 可以将.NET应用程序的HTTP请求发送到受身份识别代理(IAP)保护的appengine站点。
我们刚刚重新发布 https://cloud.google.com/iap/docs/authentication-howto 所以它现在包含C#示例代码,以及指向github上的完整示例的链接。