123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #import "OIDAuthorizationResponse.h"
- #import "OIDAuthorizationRequest.h"
- #import "OIDDefines.h"
- #import "OIDError.h"
- #import "OIDFieldMapping.h"
- #import "OIDTokenRequest.h"
- #import "OIDTokenUtilities.h"
- static NSString *const kAuthorizationCodeKey = @"code";
- static NSString *const kStateKey = @"state";
- static NSString *const kAccessTokenKey = @"access_token";
- static NSString *const kExpiresInKey = @"expires_in";
- static NSString *const kTokenTypeKey = @"token_type";
- static NSString *const kIDTokenKey = @"id_token";
- static NSString *const kScopeKey = @"scope";
- static NSString *const kAdditionalParametersKey = @"additionalParameters";
- static NSString *const kRequestKey = @"request";
- static NSString *const kTokenExchangeRequestException =
- @"Attempted to create a token exchange request from an authorization response with no "
- "authorization code.";
- @implementation OIDAuthorizationResponse
- + (NSDictionary<NSString *, OIDFieldMapping *> *)fieldMap {
- static NSMutableDictionary<NSString *, OIDFieldMapping *> *fieldMap;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- fieldMap = [NSMutableDictionary dictionary];
- fieldMap[kStateKey] =
- [[OIDFieldMapping alloc] initWithName:@"_state" type:[NSString class]];
- fieldMap[kAuthorizationCodeKey] =
- [[OIDFieldMapping alloc] initWithName:@"_authorizationCode" type:[NSString class]];
- fieldMap[kAccessTokenKey] =
- [[OIDFieldMapping alloc] initWithName:@"_accessToken" type:[NSString class]];
- fieldMap[kExpiresInKey] =
- [[OIDFieldMapping alloc] initWithName:@"_accessTokenExpirationDate"
- type:[NSDate class]
- conversion:^id _Nullable(NSObject *_Nullable value) {
- if (![value isKindOfClass:[NSNumber class]]) {
- return value;
- }
- NSNumber *valueAsNumber = (NSNumber *)value;
- return [NSDate dateWithTimeIntervalSinceNow:[valueAsNumber longLongValue]];
- }];
- fieldMap[kTokenTypeKey] =
- [[OIDFieldMapping alloc] initWithName:@"_tokenType" type:[NSString class]];
- fieldMap[kIDTokenKey] =
- [[OIDFieldMapping alloc] initWithName:@"_idToken" type:[NSString class]];
- fieldMap[kScopeKey] =
- [[OIDFieldMapping alloc] initWithName:@"_scope" type:[NSString class]];
- });
- return fieldMap;
- }
- #pragma mark - Initializers
- - (instancetype)init
- OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:))
- - (instancetype)initWithRequest:(OIDAuthorizationRequest *)request
- parameters:(NSDictionary<NSString *, NSObject<NSCopying> *> *)parameters {
- self = [super init];
- if (self) {
- _request = [request copy];
- NSDictionary<NSString *, NSObject<NSCopying> *> *additionalParameters =
- [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap]
- parameters:parameters
- instance:self];
- _additionalParameters = additionalParameters;
- }
- return self;
- }
- #pragma mark - NSCopying
- - (instancetype)copyWithZone:(nullable NSZone *)zone {
-
-
-
-
- return self;
- }
- #pragma mark - NSSecureCoding
- + (BOOL)supportsSecureCoding {
- return YES;
- }
- - (instancetype)initWithCoder:(NSCoder *)aDecoder {
- OIDAuthorizationRequest *request =
- [aDecoder decodeObjectOfClass:[OIDAuthorizationRequest class] forKey:kRequestKey];
- self = [self initWithRequest:request parameters:@{ }];
- if (self) {
- [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self];
- _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes]
- forKey:kAdditionalParametersKey];
- }
- return self;
- }
- - (void)encodeWithCoder:(NSCoder *)aCoder {
- [aCoder encodeObject:_request forKey:kRequestKey];
- [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self];
- [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey];
- }
- #pragma mark - NSObject overrides
- - (NSString *)description {
- return [NSString stringWithFormat:@"<%@: %p, authorizationCode: %@, state: \"%@\", accessToken: "
- "\"%@\", accessTokenExpirationDate: %@, tokenType: %@, "
- "idToken: \"%@\", scope: \"%@\", additionalParameters: %@, "
- "request: %@>",
- NSStringFromClass([self class]),
- (void *)self,
- _authorizationCode,
- _state,
- [OIDTokenUtilities redact:_accessToken],
- _accessTokenExpirationDate,
- _tokenType,
- [OIDTokenUtilities redact:_idToken],
- _scope,
- _additionalParameters,
- _request];
- }
- #pragma mark -
- - (OIDTokenRequest *)tokenExchangeRequest {
- return [self tokenExchangeRequestWithAdditionalParameters:nil];
- }
- - (OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters:
- (NSDictionary<NSString *, NSString *> *)additionalParameters {
-
-
- if (!_authorizationCode) {
- [NSException raise:kTokenExchangeRequestException
- format:kTokenExchangeRequestException];
- }
- return [[OIDTokenRequest alloc] initWithConfiguration:_request.configuration
- grantType:OIDGrantTypeAuthorizationCode
- authorizationCode:_authorizationCode
- redirectURL:_request.redirectURL
- clientID:_request.clientID
- clientSecret:_request.clientSecret
- scope:nil
- refreshToken:nil
- codeVerifier:_request.codeVerifier
- additionalParameters:additionalParameters];
- }
- @end
|