2016-11-05 2 views
5

Beim Versuch, Azure AD B2C zu integrieren, stehe ich mit einem Fehler "oauthConnection Error: Bad Request" fest. Nach ihrer gegebenen Probe app funktioniert alles gut. Aber nach der Integration der gleichen Kopie einfügen Code aus der Arbeit Beispiel App, und versuchen, mit Facebook oder Google Plus einloggen, es wirft einen Fehler! Ich bin mir ziemlich sicher, dass alle Anmeldeinformationen, die ich in der Beispiel-App verwendet habe, für meine App identisch sind. Irgendeine Idee darüber wird sehr geschätzt. Hier ist mein Code, AppDelegate.mAzure AD B2C wird oauthConnection Error: Bad Request

#import "AppData.h" 
#import "NXOAuth2.h" 
#import "AppDelegate.h" 

@interface AppDelegate() 

@end 

@implementation AppDelegate 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 


    [self setupOAuth2AccountStore]; 

    // Override point for customization after application launch. 
    return YES; 
} 

- (void)setupOAuth2AccountStore { 
    AppData *data = [AppData getInstance]; // The singleton we use to get the settings 

    NSDictionary *customHeaders = 
    [NSDictionary dictionaryWithObject:@"application/x-www-form-urlencoded" 
           forKey:@"Content-Type"]; 

    // Azure B2C needs 
    // kNXOAuth2AccountStoreConfigurationAdditionalAuthenticationParameters for 
    // sending policy to the server, 
    // therefore we use -setConfiguration:forAccountType: 
    NSDictionary *B2cConfigDict = @{ 
            kNXOAuth2AccountStoreConfigurationClientID : data.clientID, 
            kNXOAuth2AccountStoreConfigurationSecret : data.clientSecret, 
            kNXOAuth2AccountStoreConfigurationScope : 
             [NSSet setWithObjects:@"openid", data.clientID, nil], 
            kNXOAuth2AccountStoreConfigurationAuthorizeURL : 
             [NSURL URLWithString:data.authURL], 
            kNXOAuth2AccountStoreConfigurationTokenURL : 
             [NSURL URLWithString:data.tokenURL], 
            kNXOAuth2AccountStoreConfigurationRedirectURL : 
             [NSURL URLWithString:data.bhh], 
            kNXOAuth2AccountStoreConfigurationCustomHeaderFields : customHeaders, 
            //  kNXOAuth2AccountStoreConfigurationAdditionalAuthenticationParameters:customAuthenticationParameters 
            }; 

    [[NXOAuth2AccountStore sharedStore] setConfiguration:B2cConfigDict 
              forAccountType:data.accountIdentifier]; 
} 

LoginViewController.m

#import "AppData.h" 
#import "LoginViewController.h" 
#import "NXOAuth2.h" 

@interface LoginViewController() 

@end 

@implementation LoginViewController { 

    NSURL *myLoadedUrl; 
    bool isRequestBusy; 
} 

// Put variables here 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // OAuth2 Code 
    self.loginView.delegate = self; 
    [self requestOAuth2Access]; 
    [self setupOAuth2AccountStore]; 
    NSURLCache *URLCache = 
    [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
            diskCapacity:20 * 1024 * 1024 
             diskPath:nil]; 
    [NSURLCache setSharedURLCache:URLCache]; 

} 


- (void)resolveUsingUIWebView:(NSURL *)URL { 
    // We get the auth token from a redirect so we need to handle that in the 
    // webview. 

    if (![NSThread isMainThread]) { 
     [self performSelectorOnMainThread:@selector(resolveUsingUIWebView:) 
           withObject:URL 
          waitUntilDone:YES]; 
     return; 
    } 

    NSURLRequest *hostnameURLRequest = 
    [NSURLRequest requestWithURL:URL 
        cachePolicy:NSURLRequestUseProtocolCachePolicy 
       timeoutInterval:10.0f]; 
    isRequestBusy = YES; 
    [self.loginView loadRequest:hostnameURLRequest]; 

    NSLog(@"resolveUsingUIWebView ready (status: UNKNOWN, URL: %@)", 
      self.loginView.request.URL); 
} 

- (BOOL)webView:(UIWebView *)webView 
shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType { 
    AppData *data = [AppData getInstance]; 

    NSLog(@"webView:shouldStartLoadWithRequest: %@ (%li)", request.URL, 
      (long)navigationType); 

    // The webview is where all the communication happens. Slightly complicated. 

    myLoadedUrl = [webView.request mainDocumentURL]; 
    NSLog(@"***Loaded url: %@", myLoadedUrl); 

    // if the UIWebView is showing our authorization URL or consent URL, show the 
    // UIWebView control 
    if ([request.URL.absoluteString rangeOfString:data.authURL 
              options:NSCaseInsensitiveSearch] 
     .location != NSNotFound) { 
     self.loginView.hidden = NO; 
    } else if ([request.URL.absoluteString rangeOfString:data.loginURL 
               options:NSCaseInsensitiveSearch] 
       .location != NSNotFound) { 
     // otherwise hide the UIWebView, we've left the authorization flow 
     self.loginView.hidden = NO; 
    } else if ([request.URL.absoluteString rangeOfString:data.bhh 
               options:NSCaseInsensitiveSearch] 
       .location != NSNotFound) { 
     // otherwise hide the UIWebView, we've left the authorization flow 
     self.loginView.hidden = YES; 
     [[NXOAuth2AccountStore sharedStore] handleRedirectURL:request.URL]; 
    } else { 
     self.loginView.hidden = NO; 

    } 

    return YES; 
} 







#pragma mark - UIWebViewDelegate methods 
- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    // The webview is where all the communication happens. Slightly complicated. 
} 
- (void)handleOAuth2AccessResult:(NSURL *)accessResult { 
    // parse the response for success or failure 
    if (accessResult) 
     // if success, complete the OAuth2 flow by handling the redirect URL and 
     // obtaining a token 
    { 
     [[NXOAuth2AccountStore sharedStore] handleRedirectURL:accessResult]; 
    } else { 
     // start over 
     [self requestOAuth2Access]; 
    } 
} 
- (void)setupOAuth2AccountStore { 
    [[NSNotificationCenter defaultCenter] 
    addObserverForName:NXOAuth2AccountStoreAccountsDidChangeNotification 
    object:[NXOAuth2AccountStore sharedStore] 
    queue:nil 
    usingBlock:^(NSNotification *aNotification) { 
     if (aNotification.userInfo) { 
      // account added, we have access 
      // we can now request protected data 
      NSLog(@"Success!! We have an access token."); 
     } else { 
      // account removed, we lost access 
     } 
    }]; 

    [[NSNotificationCenter defaultCenter] 
    addObserverForName:NXOAuth2AccountStoreDidFailToRequestAccessNotification 
    object:[NXOAuth2AccountStore sharedStore] 
    queue:nil 
    usingBlock:^(NSNotification *aNotification) { 
     NSError *error = [aNotification.userInfo 
          objectForKey:NXOAuth2AccountStoreErrorKey]; 

     // Always got stuck here while trying to login with any credentials 
     NSLog(@"Error!! %@", error.localizedDescription); 
    }]; 
} 


- (void)requestOAuth2Access { 
    AppData *data = [AppData getInstance]; 

    [[NXOAuth2AccountStore sharedStore] 
    requestAccessToAccountWithType:data.accountIdentifier 
    withPreparedAuthorizationURLHandler:^(NSURL *preparedURL) { 

     NSURLRequest *r = [NSURLRequest requestWithURL:preparedURL]; 
     [self.loginView loadRequest:r]; 
    }]; 
} 

ViewController.m

#import "ViewController.h" 
#import "AppData.h" 
#import "LoginViewController.h" 
#import "NXOAuth2.h" 
// Login Action 
    - (IBAction)login:(id)sender { 
     LoginViewController *userSelectController = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"login"]; 
     [self.navigationController pushViewController:userSelectController 
              animated:YES]; 
    } 
+0

Könnten Sie die URL-Adresse, die zurückgegeben wird, wo die schlechte Anforderung auftritt ? Es klingt wie die URL oder die Anfrage ist möglicherweise nicht korrekt gebildet. –

+0

https://login.microsoftonline.com/swayamb2c.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_B2c_Mallik – Vashum

Antwort

2

Im Fall, wenn jemand in dieser stolpert, hier ist die Lösung

Zum Schote, NXOAuth2Client.m und das Verfahren - (void)requestTokenWithAuthGrant:(NSString *)authGrant redirectURL:(NSURL *)redirectURL; mit dem folgenden Code ersetzen

- (void)requestTokenWithAuthGrant:(NSString *)authGrant redirectURL:(NSURL *)redirectURL; 
{ 
    NSAssert1(!authConnection, @"authConnection already running with: %@", authConnection); 

    NSMutableURLRequest *tokenRequest = [NSMutableURLRequest requestWithURL:tokenURL]; 
    [tokenRequest setHTTPMethod:self.tokenRequestHTTPMethod]; 
    [authConnection cancel]; // just to be sure 

    self.authenticating = YES; 

    NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
             @"authorization_code", @"grant_type", 
             clientId, @"client_id", 
             // clientSecret, @"client_secret", 
             [redirectURL absoluteString], @"redirect_uri", 
             authGrant, @"code", 
             nil]; 
    if (self.desiredScope) { 
     [parameters setObject:[[self.desiredScope allObjects] componentsJoinedByString:@" "] forKey:@"scope"]; 
    } 

    if (self.customHeaderFields) { 
     [self.customHeaderFields enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) { 
      [tokenRequest addValue:obj forHTTPHeaderField:key]; 
     }]; 
    } 

    if (self.additionalAuthenticationParameters) { 
     [parameters addEntriesFromDictionary:self.additionalAuthenticationParameters]; 
    } 

    authConnection = [[NXOAuth2Connection alloc] initWithRequest:tokenRequest 
               requestParameters:parameters 
                oauthClient:self 
                 delegate:self]; 
    authConnection.context = NXOAuth2ClientConnectionContextTokenRequest; 
} 

kommentierte clientSecret das Problem gelöst