【问题标题】:What is correct way to access an Identity Aware Proxy protected GCloud AppEngine URL with dotnet?使用 dotnet 访问受 Identity Aware Proxy 保护的 GCloud AppEngine URL 的正确方法是什么?
【发布时间】:2018-07-02 11:19:17
【问题描述】:

我有一个 GCloud 部署的 appengine,它受到 Google 的身份识别代理 (IAP) 的保护,并且希望进行服务器到服务器的通信,以使用 dotnet(在本例中为 F#)从应用程序中检索 URL。所有的谷歌示例都命中了谷歌 apis 而不是 appengine 页面,我在 .Net 中没有找到任何示例。下面我的基本 F#(API 调用与您为 C# 所做的相同)设法设置服务凭据并检索令牌,但拉动应用程序的主页(应该不需要进一步的身份验证)返回以下错误。我认为这至少部分正确,因为早期提供 Bearer 令牌的尝试错误地落在谷歌登录页面而不是应用程序上。我已将服务帐户添加到授权用户列表中。 The closest google example is in Python 并使用两步过程,但 api 调用与 dotnet 库不同。对调试或修复的建议表示赞赏,

未处理的异常:System.AggregateException:一个或多个错误 发生了。 (响应状态码不表示成功:401 (未经授权)。)---> System.Net.Http.HttpRequestException:响应 状态码不表示成功:401(未授权)。在 System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() 在 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()
    ()

【问题讨论】:

  • 哪一行抛出异常?是对credential.GetAccessTokenForRequestAsync 还是credential.HttpClient.GetStringAsync 的调用?
  • GetStringAsync(网页抓取)失败。以前的 GetAccessTokenForReq.. 工作并返回一个看起来像令牌的长字符串 :) 它似乎适用于任何让我认为 URI 可能是错误的字符串。
  • 为了它的价值,我的探索更新。 Java 示例代码要复杂得多,并且暗示了一个两阶段请求。获取一个 jwt 签名的令牌,然后使用它来获取一个谷歌令牌。 cloud.google.com/iap/docs/… 。探索 API,Google OAuth api 库中似乎也有一个 ServiceAccount 凭证类和 Iam 库中的一个 GoogleCredential 类(它也有 Jwt 令牌类)。不清楚请求访问哪个 api。 OAuth、IAm 或仅适用于受 IAP 保护的 AppEngine 应用的 Google 云。

标签: .net google-app-engine f# oauth-2.0 google-authentication


【解决方案1】:

直到 5 分钟前,还几乎无法弄清楚,因为没有 .NET 示例或文档。但是是的,可以从 .NET 应用程序向受身份识别代理 (IAP) 保护的 appengine 站点发出 HTTP 请求。

我们刚刚重新发布 https://cloud.google.com/iap/docs/authentication-howto 因此它现在包含 C# 示例代码,以及指向 github 上的完整示例的链接。

【讨论】:

猜你喜欢
  • 2021-11-17
  • 2021-07-12
  • 2021-07-18
  • 2021-10-29
  • 2020-10-28
  • 2016-12-11
  • 2016-01-29
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多