aboutsummaryrefslogtreecommitdiffhomepage
path: root/Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m
diff options
context:
space:
mode:
Diffstat (limited to 'Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m')
-rw-r--r--Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m90
1 files changed, 90 insertions, 0 deletions
diff --git a/Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m b/Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m
new file mode 100644
index 0000000..bd98e82
--- /dev/null
+++ b/Example/Database/Tests/Helpers/FTestAuthTokenGenerator.m
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <CommonCrypto/CommonHMAC.h>
+#import "FTestAuthTokenGenerator.h"
+#import "Base64.h"
+
+@implementation FTestAuthTokenGenerator
+
++ (NSString *) jsonStringForData:(id)data {
+ NSData* jsonData = [NSJSONSerialization dataWithJSONObject:data
+ options:kNilOptions error:nil];
+
+ return [[NSString alloc] initWithData:jsonData
+ encoding:NSUTF8StringEncoding];
+}
+
++ (NSNumber *) tokenVersion {
+ return @0;
+}
+
++ (NSMutableDictionary *) createOptionsClaims:(NSDictionary *)options {
+ NSMutableDictionary* claims = [[NSMutableDictionary alloc] init];
+ if (options) {
+ NSDictionary* map = @{
+ @"expires": @"exp",
+ @"notBefore": @"nbf",
+ @"admin": @"admin",
+ @"debug": @"debug",
+ @"simulate": @"simulate"
+ };
+
+ for (NSString* claim in map) {
+ if (options[claim] != nil) {
+ NSString* claimName = [map objectForKey:claim];
+ id val = [options objectForKey:claim];
+ [claims setObject:val forKey:claimName];
+ }
+ }
+ }
+ return claims;
+}
+
++ (NSString *) webSafeBase64:(NSString *)encoded {
+ return [[[encoded stringByReplacingOccurrencesOfString:@"=" withString:@""] stringByReplacingOccurrencesOfString:@"+" withString:@"-"] stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
+}
+
++ (NSString *) base64EncodeString:(NSString *)target {
+ return [self webSafeBase64:[target base64EncodedString]];
+}
+
++ (NSString *) tokenWithClaims:(NSDictionary *)claims andSecret:(NSString *)secret {
+ NSDictionary* headerData = @{@"typ": @"JWT", @"alg": @"HS256"};
+ NSString* encodedHeader = [self base64EncodeString:[self jsonStringForData:headerData]];
+ NSString* encodedClaims = [self base64EncodeString:[self jsonStringForData:claims]];
+
+ NSString* secureBits = [NSString stringWithFormat:@"%@.%@", encodedHeader, encodedClaims];
+
+ const char *cKey = [secret cStringUsingEncoding:NSUTF8StringEncoding];
+ const char *cData = [secureBits cStringUsingEncoding:NSUTF8StringEncoding];
+ unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
+ CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
+ NSData* hmac = [NSData dataWithBytesNoCopy:cHMAC length:CC_SHA256_DIGEST_LENGTH freeWhenDone:NO];
+ NSString* encodedHmac = [self webSafeBase64:[hmac base64EncodedString]];
+ return [NSString stringWithFormat:@"%@.%@.%@", encodedHeader, encodedClaims, encodedHmac];
+}
+
++ (NSString *) tokenWithSecret:(NSString *)secret authData:(NSDictionary *)data andOptions:(NSDictionary *)options {
+ NSMutableDictionary* claims = [self createOptionsClaims:options];
+ [claims setObject:[self tokenVersion] forKey:@"v"];
+ NSNumber* now = [NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]];
+ [claims setObject:now forKey:@"iat"];
+ [claims setObject:data forKey:@"d"];
+ return [self tokenWithClaims:claims andSecret:secret];
+}
+
+@end