【问题标题】:MSAL authentication token issuesMSAL 身份验证令牌问题
【发布时间】: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 有效,不能混用。

标签: azure msal adal


【解决方案1】:

您可能收到的令牌仅适用于 MS Graph API,而不是您的 API,因为前端获取 Microsoft Graph API 的访问令牌。

在您的前端,您需要为您的后端 API 指定范围,如 @juunas 所述。

当您的应用程序需要为资源 API 请求具有特定权限的访问令牌时,请以如下格式传递包含 API 的应用 ID URI 的范围 -> 应用 ID URI/范围

来自MSdocs reference,不同资源的一些示例范围值:

Microsoft Graph API:https://graph.microsoft.com/User.Read

自定义网页 API:api://11111111-1111-1111-1111-111111111111/api.read

要在门户中设置范围, 转到 Azure AD 中 API 的应用注册 > 公开 API > 添加范围。 然后,Azure AD 应该为您提供一个用于您的 API 的令牌。

SO reference

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2017-01-19
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多