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