2016-07-05 4 views
0

Ich habe eine iOS 7-App, die AWS Mobile Hub für AWS-Dienste verwendet. Ich benutze Auth0 als Identitätsvermittler. Alle meine Benutzer authentifizieren sich mit OpenID.AWSSignInProvider für OpenID mit Mobile Hub

Um Mobile Hub verwenden zu können, muss ich einen AWSSSignInProvider für Auth0-Benutzer definieren. Hat irgendjemand in Objective C einen (möglicherweise generischen?) AWSSignInProvider für OpenID-Benutzer geschrieben? Ich habe eine geschrieben, aber es funktioniert nicht richtig. Es funktioniert für die anfängliche Anmeldung, aber aktualisiert die Auth0-Anmeldung für Auth0-Benutzer nicht, wenn sie sich erneut bei meiner App anmelden.

Mein Code ist unten. Es funktioniert nicht richtig.

Dank

Auth0SignInProvider.h

#import <Foundation/Foundation.h> 
#import <Lock/Lock.h> 
#import "AWSSignInProvider.h" 

@class FFKeyChain; 

#pragma clang assume_nonnull begin 
@interface FFAuth0SignInProvider : NSObject <AWSSignInProvider> 

@property (readonly, strong) FFKeyChain *        keychain; 

+ (instancetype)sharedInstance; 

- (void)completeLogin; 

@end 
#pragma clang assume_nonnull end 

Auth0SignInProvider.m

#import "Auth0SignInProvider.h" 
#import <Lock/Lock.h> 
#import "AWSIdentityManager.h" 
#import "AWSConfiguration.h" 
#import "Cloud.h" 
#import "FFCloudController.h" 
#import "FFJWT.h" 
#import "FFKeyChain.h" 

static NSString *const AWSAuth0SignInProviderKey = @"Auth0"; 
static NSString *const AWSAuth0SignInProviderUserNameKey = @"Auth0.userName"; 
static NSString *const AWSAuth0SignInProviderImageURLKey = @"Auth0.imageURL"; 
static NSTimeInterval const AWSAuth0SignInProviderTokenRefreshBuffer = 10 * 60; 

@interface AWSIdentityManager() 

- (void)completeLogin; 

@end 

@interface FFAuth0SignInProvider() 

@property (atomic, strong) AWSTaskCompletionSource *taskCompletionSource; 
@property (nonatomic, strong) dispatch_semaphore_t semaphore; 

@end 

@implementation FFAuth0SignInProvider 

@synthesize keychain=_keychain; 

+ (instancetype)sharedInstance { 
    static FFAuth0SignInProvider *_sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    //ok1 
    dispatch_once(&onceToken, ^{ 
     _sharedInstance = [FFAuth0SignInProvider new]; 
    }); 

    return _sharedInstance; 
} 

- (instancetype)init { 
    if (self = [super init]) 
    { 
     _keychain = [FFKeyChain sharedInstance]; 
    } 

    return self; 
} 

#pragma mark - Properties 

- (FFKeyChain*)keychain 
{ 
    if (!_keychain) 
    { 
     _keychain = [FFKeyChain sharedInstance]; 
    } 

    return _keychain; 
} 

#pragma mark - AWSIdentityProvider Protocol 

- (NSString *)identityProviderName 
{ 
    return [[NSBundle mainBundle] infoDictionary][STRAuth0DomainKey]; 
} 

- (AWSTask<NSString *> *)token 
{ 
    NSString* tokenString = [[self keychain] stringForKey:UDAuth0IdToken]; 
    NSString* refreshToken = [[self keychain] stringForKey:UDAuth0RefreshToken]; 
    NSDate* idTokenExpirationDate = [[[FFJWT alloc] initWithToken:tokenString] expDate]; 

    if (tokenString 
     // If the cached token expires within 10 min, tries refreshing a token. 
     && [idTokenExpirationDate compare:[NSDate dateWithTimeIntervalSinceNow:AWSAuth0SignInProviderTokenRefreshBuffer]] == NSOrderedDescending) { 
     return [AWSTask taskWithResult:tokenString]; 
    } 

    AWSTaskCompletionSource *taskCompletionSource = [AWSTaskCompletionSource taskCompletionSource]; 
    A0Lock* lock = [A0Lock sharedLock]; 
    A0APIClient* client = [lock apiClient]; 
    A0AuthParameters* params = [A0AuthParameters newDefaultParams]; 
    params[A0ParameterConnection] = [[FFCloudController sharedInstance] auth0ConnectionName:[[NSUserDefaults standardUserDefaults] integerForKey:UDLoginType]]; 
    [client fetchNewIdTokenWithRefreshToken:refreshToken parameters:params success:^(A0Token * _Nonnull token) 
    { 
     NSLog(@"Success - token"); 

     [[self keychain] setString:token.idToken ForKey:UDAuth0IdToken]; 
     taskCompletionSource.result = token.idToken; 

    } failure:^(NSError * _Nonnull error) 
    { 
     NSLog(@"Error - token: %@", error); 

     taskCompletionSource.error = error; 
    }]; 

    return taskCompletionSource.task; 
} 

- (BOOL)isLoggedIn { 
    NSData* profile = [[self keychain] dataForKey:UDAuth0Profile]; 
    return [[NSUserDefaults standardUserDefaults] objectForKey:AWSAuth0SignInProviderKey] != nil && (profile != nil); 
} 

- (NSString *)userName { 
    return [[NSUserDefaults standardUserDefaults] objectForKey:AWSAuth0SignInProviderUserNameKey]; 
} 

- (void)setUserName:(NSString *)userName { 
    [[NSUserDefaults standardUserDefaults] setObject:userName 
               forKey:AWSAuth0SignInProviderUserNameKey]; 
} 

- (NSURL *)imageURL { 
    return [NSURL URLWithString:[[NSUserDefaults standardUserDefaults] objectForKey:AWSAuth0SignInProviderImageURLKey]]; 
} 

- (void)setImageURL:(NSURL *)imageURL { 
    [[NSUserDefaults standardUserDefaults] setObject:imageURL.absoluteString 
               forKey:AWSAuth0SignInProviderImageURLKey]; 
} 

- (void)reloadSession { 
    if ([[NSUserDefaults standardUserDefaults] objectForKey:AWSAuth0SignInProviderKey] 
     && [[self keychain] stringForKey:UDAuth0IdToken]) 
    { 
     [self completeLogin]; 
    } 
} 

- (void)completeLogin { 
    [[NSUserDefaults standardUserDefaults] setObject:@"YES" 
               forKey:AWSAuth0SignInProviderKey]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [[AWSIdentityManager sharedInstance] completeLogin]; 

    A0UserProfile *profile = [NSKeyedUnarchiver unarchiveObjectWithData:[[self keychain] dataForKey:UDAuth0Profile]]; 
    self.userName = profile.email; 
} 

- (void)login 
{ 
    if ([[self keychain] stringForKey:UDAuth0IdToken]) 
    { 
     [self completeLogin]; 
     return; 
    } 

    A0AuthParameters* params = [A0AuthParameters newDefaultParams]; 
    params[A0ParameterConnection] = [[FFCloudController sharedInstance] auth0ConnectionName:[[NSUserDefaults standardUserDefaults] integerForKey:UDLoginType]]; 

    [[[A0Lock sharedLock] apiClient] loginWithUsername:[[FFKeyChain sharedInstance] stringForKey:UDEmail] password:[[FFKeyChain sharedInstance] stringForKey:UDPassword] parameters:params success:^(A0UserProfile * _Nonnull profile, A0Token * _Nonnull tokenInfo) 
    { 
     [[self keychain] setString:tokenInfo.idToken ForKey:UDAuth0IdToken]; 
     [[self keychain] setString:tokenInfo.refreshToken ForKey:UDAuth0RefreshToken]; 
     [[self keychain] setData:[NSKeyedArchiver archivedDataWithRootObject:profile] ForKey:UDAuth0Profile]; 

     [self completeLogin]; 

    } failure:^(NSError * _Nonnull error) 
    { 
     NSLog(@"Auth0 login error: %@", error); 
    }]; 
} 

- (void)logout 
{ 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:AWSAuth0SignInProviderKey]; 
    [[self keychain] removeObjectForKey:UDAuth0IdToken]; 
    [[self keychain] removeObjectForKey:UDAuth0AccessToken]; 
    [[self keychain] removeObjectForKey:UDAuth0RefreshToken]; 
    [[self keychain] removeObjectForKey:UDAuth0Profile]; 
    [[[A0Lock sharedLock] apiClient] logout]; 
} 

#pragma mark - Application delegates 

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    return YES; 
} 

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return [[A0Lock sharedLock] handleURL:url sourceApplication:sourceApplication]; 
} 

@end 

Antwort

0

Es wird nur versuchen, eine aktualisierte Anmeldungen Karte zu erhalten, wenn die mit dem CredentialsProvider zugehörigen Anmeldeinformationen abgelaufen sind. Haben Sie versucht, clearCredentials auf dem CredentialsProvider aufzurufen, wenn Sie sich abmelden, um die Aktualisierung zu erzwingen?