2

我正在尝试从我的 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;
}

之后我登录谷歌。

if GIDSignIn.sharedInstance().hasAuthInKeychain() {
   GIDSignIn.sharedInstance().signInSilently()
} else {
   GIDSignIn.sharedInstance().signIn()
}

登录后,我将 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()
}

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

4

1 回答 1

7

更新:截至 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-[...]))

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

我们的文档似乎缺少这一步,我会处理的。(感谢您的举报!)

于 2019-02-16T05:37:42.060 回答