簡體   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