使用不记名令牌访问受 Google Cloud IAP 保护的资源会出现错误代码 13

Ale*_*der 2 google-app-engine google-iap

我正在尝试从我的 iOS 应用访问受 Google Cloud IAP 保护的资源。

我可以从应用程序登录到我的 Google 帐户并接收 ID 令牌,但是在我想要请求的资源的 Authorization 标头中将 ID 令牌设置为不记名令牌时,我收到以下响应,其中包含 HTTP 错误代码 401。

“您的请求有问题。错误代码 13”

我试图用 Postman 发送请求,但这也导致了同样的错误。

我使用以下代码从下载的credentials.plist 文件中设置客户端ID。

if let path = Bundle.main.path(forResource: "credentials", ofType: "plist") {
   let nsDictionary = NSDictionary(contentsOfFile: path)
   let clientId = nsDictionary!["CLIENT_ID"] as? String

   GIDSignIn.sharedInstance().clientID = clientId
   GIDSignIn.sharedInstance().delegate = self
   GIDSignIn.sharedInstance().uiDelegate = self;
}
Run Code Online (Sandbox Code Playgroud)

之后我登录谷歌。

if GIDSignIn.sharedInstance().hasAuthInKeychain() {
   GIDSignIn.sharedInstance().signInSilently()
} else {
   GIDSignIn.sharedInstance().signIn()
}
Run Code Online (Sandbox Code Playgroud)

登录后,我将 idToken 发送到受 Google Cloud IAP 保护的资源。

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
   let token = user.authentication.idToken

   var request = URLRequest(url: URL(string: url)!)

   request.httpMethod = httpMethod
   request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")

   URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
    }).resume()
}
Run Code Online (Sandbox Code Playgroud)

我希望得到成功的响应,但目前我收到 HTTP 错误代码 401 以及前面提到的错误消息。

Mat*_*chs 5

更新:截至 7 月 11 日,当令牌出现问题时,IAP 用户现在应该收到比“错误代码 13”更具描述性的错误。

一些例子:

$ curl -H 'Authorization: bearer schmearer' $IAP_URL
Invalid IAP credentials: Expected JWT to have 3 parts separated by a '.' but there are 1 parts
$ curl -H 'Authorization: bearer a.b.c' $IAP_URL
Invalid IAP credentials: Base64 decode failed on token: a.b.c
> ^C
msachs@msachs-ubi:~$ curl -H 'Authorization: bearer [real token]' $IAP_URL
Invalid IAP credentials: JWT signature is invalid
msachs@msachs-ubi:~$ curl -H 'Authorization: bearer [real token]' $IAP_URL
Invalid IAP credentials: JWT audience doesn't match this application ('aud' claim (5939454960-[...]) doesn't match expected value (1042451928015-[...]))
Run Code Online (Sandbox Code Playgroud)

“错误代码 13”表示 IAP 不喜欢您的令牌。在这种情况下,我认为问题在于您需要将serverClientId 属性设置为IAP 应用程序使用的客户端 ID。您可以通过转到IAP 控制台,找到您要连接的资源,然后从该资源表行的溢出菜单中选择“编辑 OAuth 客户端”来找到它。

我们的文档似乎缺少那一步,我会处理的。(感谢您标记它!)