2017-09-11 15 views
1

私はAzure ADテナントを使用してアンドロイド用のAppAuthテストアプリを構築しました。今私はiOS(Swift 4)と同じことを試みており、アクセストークンのアクセスコードを交換しようとしているときに失敗しています。エラーは返されず、idTokenは取得されますが、accessTokenまたはrefreshTokenは返されません。その他のエラーはありません。何が起こっているか分からない。アクセストークンがなければグラフを照会できません。私はAzure AD v2を使用しています。私のコードの一部です:AppAuth iOSトークンエクスチェンジの問題Azure AD

func appAuthAuthorize(authConfig: AuthConfig) { 
    let serviceConfiguration = OIDServiceConfiguration(
     authorizationEndpoint: NSURL(string: authConfig.authEndPoint)! as URL, 
     tokenEndpoint: NSURL(string: authConfig.tokenEndPoint)! as URL) 

    let request = OIDAuthorizationRequest(configuration: serviceConfiguration, clientId: authConfig.clientId, scopes: [OIDScopeOpenID, OIDScopeProfile], redirectURL: NSURL(string: authConfig.redirectUri)! as URL, responseType: OIDResponseTypeCode, additionalParameters: nil) 

    doAppAuthAuthorization(authRequest: request) 
} 


func doAppAuthAuthorization(authRequest: OIDAuthorizationRequest) { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 

    appDelegate.currentAuthorizationFlow = OIDAuthorizationService.present(authRequest, presenting: self, callback: { 
     (authorizationResponse, error) in 
     if (authorizationResponse != nil) { 
      self.authState = OIDAuthState(authorizationResponse: authorizationResponse!) 
      self.logMessage(message: "Got authorization code: \(String(describing: self.authState?.lastAuthorizationResponse.authorizationCode))") 
      self.doTokenRequest() 
     } else { 
      self.authState = nil 
      self.logMessage(message: "Authorization error: \(String(describing: error?.localizedDescription))") 
     } 
    }) 
} 

func doTokenRequest() { 
    let tokenExchangeRequest = authState?.lastAuthorizationResponse.tokenExchangeRequest() 

    OIDAuthorizationService.perform(tokenExchangeRequest!) { 
     tokenResponse, error in 
     if tokenResponse == nil{ 
      self.logMessage(message: "Token exchange error: \(error!.localizedDescription)") 
     } else { 
      self.authState?.update(with: tokenResponse!, error: error) 
      self.saveState() 
      self.logMessage(message: "Received token response with accesToken: \(tokenResponse!.idToken!)") 
      self.logMessage(message: "Received token response with accesToken: \(tokenResponse!.refreshToken!)") 
      self.logMessage(message: "Received token response with accesToken: \(tokenResponse!.accessToken!)") 
      self.retrieveUserProfile() 
     } 

     self.authState?.update(with: tokenResponse, error: error) 
    } 
} 
+0

あなたはPowerShellを使用してグラフAPIにアプリケーションを登録したことがありますか?私はv1.6でこれを行う必要がありますが、私はv2でそれが必要であるかどうかはわかりません。 – Pytry

+0

する必要はありません。私のAndroidアプリとMSALを使用したiOSの例は正常に動作します。その唯一のAppAuthは正しく動作しません。 – Igor

+0

ああ、大丈夫です。 OpenIdConnectの快適なフローを提供できるかもしれませんが、私はMSALを一度も使用していません。ごめんなさい。 – Pytry

答えて

1

答えを得ました。問題は、許可サーバーに応じて、スコープをそのサーバーに対して定義しなければならないことです。上記のコードでは、OIDScopeOpenIDとOIDScopeProfileのデフォルトのOpenIdスコープを使用しました。私はこれをUser.ReadのAzure ADスコープに変更すると、すべてが正しく動作するようになりました。そこでここでは、機能appAuthAuthorize内のコードへの正味の変化は次のとおりです。

func appAuthAuthorize(authConfig: AuthConfig) { 
let serviceConfiguration = OIDServiceConfiguration(
    authorizationEndpoint: NSURL(string: authConfig.authEndPoint)! as URL, 
    tokenEndpoint: NSURL(string: authConfig.tokenEndPoint)! as URL) 

let request = OIDAuthorizationRequest(configuration: serviceConfiguration, clientId: authConfig.clientId, scopes: ["User.Read"], redirectURL: NSURL(string: authConfig.redirectUri)! as URL, responseType: OIDResponseTypeCode, additionalParameters: nil) 

doAppAuthAuthorization(authRequest: request) 

}

+0

トークン交換エラーが発生しました:操作を完了できませんでした。 OAuthエラー:invalid_grant "、同様の問題に直面しましたか? – Jan

関連する問題