繁体   English   中英

Azure AD B2C刷新令牌/ ID令牌iOS Swift 4

[英]Azure AD B2C Refresh Token/ID Token iOS Swift 4

我正在开发一个iOS应用程序,利用ROPC流程和AADB2C作为后端端点支持这一点。 https://login.microsoftonline.com/{TENANTNAME}.onmicrosoft.com/oauth2/v2.0/token?p={ROPC Policy Name}

我成功地能够在客户第一次使用电子邮件/密码成功登录时请求和检索access tokenrefresh tokenID token

成功登录后,每次后续登录,我们都希望利用生物识别技术(触摸/面部识别码)。 我的第一个想法是将refreshToken存储在Keychain中,在强制用户输入他/她的email / pw之前检查是否存在refreshToken

如果存在refreshToken ,那么我想我会使用一个调用令牌端点,使用?p=refresh_token而不是?p={INSERT ROPC Policy Name} ,如果我返回成功,那么我使用Touch / Face要登录的ID。

另一个想法是只使用令牌ID进行身份验证。

因此,我的问题是双重的:

  1. 更好的做法是什么 - 对于iOS本机应用程序来说,使用刷新令牌或ID令牌。

  2. 我尝试使用刷新令牌,用?p=refresh_token交换{ROPC Policy Name}参数,但每次我尝试配置请求时,都会收到错误消息"The request body must contain the following parameter: 'grant_type'"我添加了”refresh_token“作为关键grant_type的值,并且该错误仍然出现。 - 为什么这样,如果刷新令牌grant_type更好,我该如何解决它。

你是对的。

您可以将刷新令牌保存到密钥链,并使用Face或Touch ID保护此刷新令牌的使用。

在Azure AD B2C中配置资源所有者密码凭据流”文档 的“兑换刷新令牌”部分介绍了如何兑换为资源所有者策略颁发的刷新令牌:

POST /{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&response_type=id_token
&client_id={client_id}
&resource={client_id}
&refresh_token={refresh_token}

谢谢@Chris Padgett。 我能够使用略微修改的请求启动并运行AppAuth。 这是我的代码。

let authorizationEndpoint = URL(string: "https://login.microsoftonline.com/{TENANT_NAME}.onmicrosoft.com/oauth2/v2.0/authorize?p={ROPC_POLICY_NAME}")
let tokenEndpoint = URL(string: "https://login.microsoftonline.com/{TENANT_NAME}.onmicrosoft.com/oauth2/v2.0/token?p={ROPC_POLICY_NAME}")
let configuration = OIDServiceConfiguration(authorizationEndpoint: authorizationEndpoint!, tokenEndpoint: tokenEndpoint!)

//Configuring the token request
let tokenExchangeRequest = OIDTokenRequest(
    configuration: configuration,
    grantType: OIDGrantTypeRefreshToken,
    authorizationCode: nil,
    redirectURL: self.redirectUri!,
    clientID: self.clientId,
    clientSecret: nil,
    scope: "openid \(self.clientId) offline_access",
    refreshToken: {INSERT_REFRESH_TOKEN_HERE},
    codeVerifier: nil,
    additionalParameters: nil
)

//Performing token request
OIDAuthorizationService.perform(tokenExchangeRequest, callback: { tokenResponse, error in

    if tokenResponse == nil {
        print("Token request error: %@", error?.localizedDescription as Any)
    } else {
        guard let tokenResponse = tokenResponse else { return }
        ...handle tokenResponse how you need to...
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM