【发布时间】:2021-10-15 16:43:59
【问题描述】:
我在iOS 中集成了MSAL 库以获取令牌并发送到我们的backend 服务器以供进一步使用。我们正在使用下面的代码来获取令牌:
let kClientID = "xxxxxx-xxxx-xxxx-xxxx-xxxxxx"
let kGraphEndpoint = "https://graph.microsoft.com/"
let kAuthority = "https://login.microsoftonline.com/xxxxxx-xxxx-xxxx-xxxx-xxxxxx"
let kScopes: [String] = ["user.read"]
let bundleID = Bundle.main.bundleIdentifier ?? "com.default.test"
let kRedirectUri = "msauth.\(bundleID)://auth"
获取令牌代码:
if let applicationContext = self.applicationContext, let webViewParameters = self.webViewParamaters {
let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: webViewParameters)
parameters.promptType = .selectAccount
applicationContext.acquireToken(with: parameters) { (result, error) in
if let error = error {
self.log(text: "Could not acquire token: \(error)")
return
}
guard let result = result else {
self.log(text: "Could not acquire token: No result returned")
return
}
self.token = result.accessToken
// calling graph API to get the name and user id ( Success )
// sending this token to our API backend ( Failure 401 )
}
}
问题:
当 Graph API 在获取令牌后从前端 iOS 应用程序调用时,它正在工作,而当我们向后端发送相同的令牌时,它在获取 401 error 时不起作用。相同的令牌对后端应用程序无效,但是当我们在 iOS 应用程序中使用 ADAL 库时,它是有效的。
是因为重定向 URI 吗?在 ADAL 中,我们使用 API 端点作为重定向,现在我们使用 "msauth.\(bundleID)://auth" 这种格式。
请帮忙。
【问题讨论】:
-
您需要获得 2 个访问令牌,一个用于 MS Graph,一个用于您的后端。为此,您可以使用不同的范围两次调用获取令牌。访问令牌只对一个 API 有效,不能混用。