MSAL 身份验证令牌问题
MSAL authentication token issues
我已经在 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"
这种格式。
请帮忙。
您收到的令牌可能仅适用于 MS Graph API,而不是您的 API,因为前端获取 Microsoft Graph API 的访问令牌。
在你的前端,你需要为你的后端指定范围 API 正如@juunas 所提到的。
When your application needs to request an access token with specific permissions for a resource API, pass the scopes containing the app ID URI of the API in the format like this-> app ID URI/scope
来自 MSdocs reference,不同资源的一些示例范围值:
Microsoft Graph API: https://graph.microsoft.com/User.Read
Custom web API:api://11111111-1111-1111-1111-111111111111/api.read
要在门户中设置范围,
转到 Azure AD 中 API 的应用程序注册> 公开 API> 添加范围。
然后,Azure AD 应该会为您提供一个用于 API.
的令牌
我已经在 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"
这种格式。
请帮忙。
您收到的令牌可能仅适用于 MS Graph API,而不是您的 API,因为前端获取 Microsoft Graph API 的访问令牌。
在你的前端,你需要为你的后端指定范围 API 正如@juunas 所提到的。
When your application needs to request an access token with specific permissions for a resource API, pass the scopes containing the app ID URI of the API in the format like this-> app ID URI/scope
来自 MSdocs reference,不同资源的一些示例范围值:
Microsoft Graph API: https://graph.microsoft.com/User.Read
Custom web API:api://11111111-1111-1111-1111-111111111111/api.read
要在门户中设置范围, 转到 Azure AD 中 API 的应用程序注册> 公开 API> 添加范围。 然后,Azure AD 应该会为您提供一个用于 API.
的令牌