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