2016-07-05 3 views
0

AWSサービス用のAWSモバイルハブを使用するiOS 7アプリケーションがあります。私はアイデンティティブローカーとしてAuth0を使用しています。私のすべてのユーザはOpenIDを使って認証します。モバイルハブを使用したOpenID用のAWSSignInProvider

モバイルハブを使用するには、Auth0ユーザー用にAWSSignInProviderを定義する必要があります。 OpenIDユーザーのためにObjective Cに誰か(おそらくジェネリック?)AWSSignInProviderを書いていますか?私はそれを書いたが、正しく動作しない。初期ログインでは機能しますが、Auth0ユーザーが自分のアプリに再ログインしたときにAuth0ログインを更新することはありません。

私のコードは以下の通りです。それは正しく動作しません。

おかげ

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 

答えて

0

それだけCredentialsProviderに関連付けられた資格証明書の有効期限が切れている場合は、更新のログイン・マップを取得しようとします。リフレッシュするためにログアウトするときにCredentialsProviderにclearCredentialsを呼び出そうとしましたか?

関連する問題