![](/img/trans.png)
[英]Azure B2C Refresh Token Functionality Not Working In iOS Swift Sample App
[英]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 token
, refresh token
和ID token
。
成功登錄后,每次后續登錄,我們都希望利用生物識別技術(觸摸/面部識別碼)。 我的第一個想法是將refreshToken存儲在Keychain中,在強制用戶輸入他/她的email / pw之前檢查是否存在refreshToken
。
如果存在refreshToken
,那么我想我會使用一個調用令牌端點,使用?p=refresh_token
而不是?p={INSERT ROPC Policy Name}
,如果我返回成功,那么我使用Touch / Face要登錄的ID。
另一個想法是只使用令牌ID進行身份驗證。
因此,我的問題是雙重的:
更好的做法是什么 - 對於iOS本機應用程序來說,使用刷新令牌或ID令牌。
我嘗試使用刷新令牌,用?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.