iOS中的Azure AD B2C ROPC流错误(Swift 4)-资源所有者流只能由通过B2C管理门户创建的应用程序使用

iOS中的Azure AD B2C ROPC流错误(Swift 4)-资源所有者流只能由通过B2C管理门户创建的应用程序使用,ios,swift,azure,azure-ad-b2c,Ios,Swift,Azure,Azure Ad B2c,我正在尝试将Azure AD B2C ROPC流实现到iOS Swift 4应用程序中。我已经按照和中的说明进行了操作。我已替换了以下请求参数: kIssuer: "https://login.microsoftonline.com/tfp/{Tenant Name}.onmicrosoft.com/{Signin Policy Name}/v2.0" kIssuerROPC: "https://login.microsoftonline.com/tfp/{tenantName}.onmicro

我正在尝试将Azure AD B2C ROPC流实现到iOS Swift 4应用程序中。我已经按照和中的说明进行了操作。我已替换了以下请求参数:

kIssuer: "https://login.microsoftonline.com/tfp/{Tenant Name}.onmicrosoft.com/{Signin Policy Name}/v2.0"
kIssuerROPC: "https://login.microsoftonline.com/tfp/{tenantName}.onmicrosoft.com/{Resource Owner Policy Name}/v2.0"
kClientId: "{Application ID}"
kRedirectUri: "https://login.microsoftonline.com/tfp/oauth2/nativeclient"
我的
附加参数如下所示:

"[
    username": "{test email account}",
    "password": "{test password}",
    "scope": "openid {kClientId} offline_access",
    "response_type": "token id_token
]"
我将按如下方式执行方法
OIDTokenRequest

OIDTokenRequest(
    configuration: configuration!, 
    grantType: OIDGrantTypePassword, 
    authorizationCode: nil, 
    redirectURL: redirectURI!, 
    clientID: self.kClientID, 
    clientSecret: nil, 
    scope: additionalParameters["scope"], 
    refreshToken: nil, 
    codeVerifier: nil, 
    additionalParameters: additionalParameters
)
我打印出以下消息:

"Performing ROPC with request [%@] <OIDTokenRequest: 0x6000002a17a0, request: <URL:https://login.microsoftonline.com/te/{tenant}.onmicrosoft.com/b2c_1_ropc_auth/oauth2/token, HTTPBody: password=TESTPW&response_type=token%20id_token&scope=openid%KCLIENTID%20offline_access&scope=openid%20KCLIENTID%20offline_access&refresh_token=offline_access&grant_type=password&username=TESTEMAIL&redirect_uri=https://login.microsoftonline.com/tfp/oauth2/nativeclient&client_id=KCLIENTID>>
“使用请求[%@]执行ROPC”
在这里,我编写了testmail、TESTPW和KCLIENTID,如前两组参数中所述

我收到了这个错误

令牌请求错误:“未经授权的\u客户端:AADB2C90248:资源所有者流只能由通过B2C管理门户创建的应用程序使用。

我正在使用我在Azure AD B2C中注册的应用程序的
kClientId
,它在请求URL中显示了3次不同的时间。我尝试了各种参数组合,但这是我能得到的最远的组合

我能想到的唯一一个可能无法正常工作的部分是示例中的
kreditori
msalb35a3d9b://oauth/redirect
,以及本示例中的步骤4 特别说明将
info.plist
值更改为
msalb35a3d9b

在我的AADB2C注册应用程序中,我有2个重定向URI

urn:ietf:wg:oauth:2.0:oob
https://login.microsoftonline.com/tfp/oauth2/nativeclient

我已将
urn:ietf:wg
添加到
info.plist
,但没有任何效果。我仍然会犯同样的错误


有人能帮我解决这个问题吗?

你需要确保你到达了V2端点,否则你会看到错误

尝试:


{tenant}.onmicrosoft.com/b2c_1_ropc_auth/oauth2/V2.0/token

这是适合我的配置

let clientId = "{Application ID}"
let authorizationEndpoint = URL(string: "https://login.microsoftonline.com/{TenantName}.onmicrosoft.com/oauth2/v2.0/authorize?p={ROPC Policy Name}")
let tokenEndpoint = URL(string: "https://login.microsoftonline.com/{TenantName}.onmicrosoft.com/oauth2/v2.0/token?p={ROPC Policy Name}")
let redirectUri = URL(string: "urn:ietf:wg:oauth:2.0:oob")

let configuration = OIDServiceConfiguration(authorizationEndpoint: authorizationEndpoint!, tokenEndpoint: tokenEndpoint!)

let additionalParameters = [
        "username": "{Username}",
        "password": "{Password}",
        "scope": "openid {Application ID} offline_access",
        "response_type": "token id_token"
    ]

let tokenExchangeRequest = OIDTokenRequest(configuration: configuration, grantType: OIDGrantTypePassword, authorizationCode: nil, redirectURL: self.redirectUri!, clientID: self.clientId, clientSecret: nil, scope: nil, refreshToken: nil, codeVerifier: nil, additionalParameters: additionalParameters)
然后执行对令牌的请求

OIDAuthorizationService.perform(tokenExchangeRequest, callback: { tokenResponse, error in
        if tokenResponse == nil {
            print("Token request error: %@", error?.localizedDescription as Any)
        } else {
            print("Received token response with accessToken: %@", tokenResponse?.accessToken as Any)
        }
    })

我试着用你的建议作为
kIssuer
kIssuerROPC
kreditori
,但没有成功。我现在遇到此错误:
检索发现文档时出错:%@可选(“操作无法完成。
您应该只需要更改/检查kIssuerROPC。因为这是用于确定元数据URL的内容,它从中获取令牌端点。只要是
https://login.microsoftonline.com/tfp/{tenantName}.onmicrosoft.com/{Resource Owner Policy Name}/v2.0
你应该没问题。从你给出的日志来看,虽然它没有达到v2.0 endpooint。当我创建ROPC策略时,它生成了一个包含各种配置元数据的端点。我使用了那里关于授权端点和令牌端点的信息来填充AppAuth配置。令牌请求st exchange不包括颁发者终结点。