Skip to content

Commit 88fcc5f

Browse files
committed
Porting nonce acquisition code from broker
1 parent 8f9bfc7 commit 88fcc5f

File tree

6 files changed

+729
-0
lines changed

6 files changed

+729
-0
lines changed

IdentityCore/IdentityCore.xcodeproj/project.pbxproj

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,14 @@
736736
728D9E4628245DD7001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 728D9E4528245DD7001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.m */; };
737737
728D9E4728245DD7001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 728D9E4528245DD7001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.m */; };
738738
728D9E492824A323001D990F /* MSIDPkeyAuthHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CA0C5E220A68D400768729 /* MSIDPkeyAuthHelperTests.m */; };
739+
729357E82DD810CA0001D03C /* MSIDNonceTokenRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 729357E72DD810C70001D03C /* MSIDNonceTokenRequest.h */; };
740+
729357EA2DD810D00001D03C /* MSIDNonceTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357E92DD810CD0001D03C /* MSIDNonceTokenRequest.m */; };
741+
729357EB2DD810D00001D03C /* MSIDNonceTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357E92DD810CD0001D03C /* MSIDNonceTokenRequest.m */; };
742+
729357ED2DDBCBA60001D03C /* MSIDNonceTokenRequestMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 729357EC2DDBCB930001D03C /* MSIDNonceTokenRequestMock.h */; };
743+
729357EF2DDBCBAE0001D03C /* MSIDNonceTokenRequestMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357EE2DDBCBAB0001D03C /* MSIDNonceTokenRequestMock.m */; };
744+
729357F02DDBCBAE0001D03C /* MSIDNonceTokenRequestMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357EE2DDBCBAB0001D03C /* MSIDNonceTokenRequestMock.m */; };
745+
729357F32DDBD3F80001D03C /* MSIDNonceTokenRequestTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357F22DDBD3F60001D03C /* MSIDNonceTokenRequestTest.m */; };
746+
729357F42DDBD3F80001D03C /* MSIDNonceTokenRequestTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 729357F22DDBD3F60001D03C /* MSIDNonceTokenRequestTest.m */; };
739747
740340B92460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 740340B72460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.h */; };
740748
740340BA2460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 740340B82460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.m */; };
741749
740340BB2460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 740340B82460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.m */; };
@@ -2629,6 +2637,11 @@
26292637
728209D32702AE9300B5F018 /* MSIDBackgroundTaskManagerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDBackgroundTaskManagerTests.m; sourceTree = "<group>"; };
26302638
728D9E4528245DD7001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDTestSecureEnclaveKeyPairGenerator.m; sourceTree = "<group>"; };
26312639
728D9E4828247D4C001D990F /* MSIDTestSecureEnclaveKeyPairGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSIDTestSecureEnclaveKeyPairGenerator.h; sourceTree = "<group>"; };
2640+
729357E72DD810C70001D03C /* MSIDNonceTokenRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSIDNonceTokenRequest.h; sourceTree = "<group>"; };
2641+
729357E92DD810CD0001D03C /* MSIDNonceTokenRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDNonceTokenRequest.m; sourceTree = "<group>"; };
2642+
729357EC2DDBCB930001D03C /* MSIDNonceTokenRequestMock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSIDNonceTokenRequestMock.h; sourceTree = "<group>"; };
2643+
729357EE2DDBCBAB0001D03C /* MSIDNonceTokenRequestMock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDNonceTokenRequestMock.m; sourceTree = "<group>"; };
2644+
729357F22DDBD3F60001D03C /* MSIDNonceTokenRequestTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDNonceTokenRequestTest.m; sourceTree = "<group>"; };
26322645
740340B72460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSIDCurrentRequestTelemetrySerializedItem.h; sourceTree = "<group>"; };
26332646
740340B82460E5C400DFCF27 /* MSIDCurrentRequestTelemetrySerializedItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDCurrentRequestTelemetrySerializedItem.m; sourceTree = "<group>"; };
26342647
74043F7C245CC84B00D3E7C1 /* MSIDCurrentRequestTelemetryTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSIDCurrentRequestTelemetryTests.m; sourceTree = "<group>"; };
@@ -3749,6 +3762,8 @@
37493762
23642AB32187D88C00F97009 /* mocks */ = {
37503763
isa = PBXGroup;
37513764
children = (
3765+
729357EE2DDBCBAB0001D03C /* MSIDNonceTokenRequestMock.m */,
3766+
729357EC2DDBCB930001D03C /* MSIDNonceTokenRequestMock.h */,
37523767
23FB5C32225585E6002BF1EB /* MSIDClaimsRequestMock.h */,
37533768
23FB5C33225585E6002BF1EB /* MSIDClaimsRequestMock.m */,
37543769
23642AB52187D88C00F97009 /* MSIDAuthorityMock.h */,
@@ -5056,6 +5071,8 @@
50565071
B2AF1D29218BCDEF0080C1A0 /* requests */ = {
50575072
isa = PBXGroup;
50585073
children = (
5074+
729357E92DD810CD0001D03C /* MSIDNonceTokenRequest.m */,
5075+
729357E72DD810C70001D03C /* MSIDNonceTokenRequest.h */,
50595076
B2C708A0219A55CB00D917B8 /* sdk */,
50605077
B2C7087F2198DE0000D917B8 /* broker */,
50615078
B28D90BC218FE9FA00E230D6 /* result */,
@@ -5662,6 +5679,7 @@
56625679
D6DA89731FBA6A4E004C56C7 /* tests */ = {
56635680
isa = PBXGroup;
56645681
children = (
5682+
729357F22DDBD3F60001D03C /* MSIDNonceTokenRequestTest.m */,
56655683
A0410E4F25E88B5E004D80FD /* MSIDThrottlingMetaDataTest.m */,
56665684
A0410E1925E87E1A004D80FD /* MSIDThrottlingModelNonRecoverableServerError.m */,
56675685
A0410E0725E81C5D004D80FD /* MSIDThrottlingModel429Test.m */,
@@ -6121,6 +6139,7 @@
61216139
B251CC202040F6C6005E0179 /* MSIDDefaultCredentialCacheKey.h in Headers */,
61226140
B286B9C02389DE38007833AD /* MSIDPrimaryRefreshToken.h in Headers */,
61236141
9686480420C7711400EF7E73 /* MSIDAADV1WebviewFactory.h in Headers */,
6142+
729357E82DD810CA0001D03C /* MSIDNonceTokenRequest.h in Headers */,
61246143
58BC23BC271F6B9D008A77BE /* MSIDSSOExtensionGetDataBaseRequest.h in Headers */,
61256144
580E254A271A0236003D1795 /* MSIDBrokerOperationGetSsoCookiesResponse.h in Headers */,
61266145
B286B9A72389DD2E007833AD /* MSIDAADOAuthEmbeddedWebviewController.h in Headers */,
@@ -6426,6 +6445,7 @@
64266445
2A366B7B2D9EF78600774DD4 /* MSIDXpcProviderCacheMock.h in Headers */,
64276446
B4C8501829E79E250055B0D3 /* MSIDTestURLSessionUploadTask.h in Headers */,
64286447
D626FFF91FBD200A00EE4487 /* MSIDTestURLSession.h in Headers */,
6448+
729357ED2DDBCBA60001D03C /* MSIDNonceTokenRequestMock.h in Headers */,
64296449
B2E4A07224DDE56A007CE642 /* MSIDTestCacheAccessorHelper.h in Headers */,
64306450
B245C2F92106ABDC00CD5A52 /* MSIDTestIdTokenUtil.h in Headers */,
64316451
1E0B145024CF5ADD00825143 /* MSIDAssymetricKeyPair+Test.h in Headers */,
@@ -7014,6 +7034,7 @@
70147034
B286B9F12389F866007833AD /* MSIDWebviewFactoryTests.m in Sources */,
70157035
B252913B2096698100E78695 /* MSIDAADIdTokenClaimsFactoryTests.m in Sources */,
70167036
B2BE923121A0EFB100F5AB8C /* MSIDDefaultTokenRequestProviderTests.m in Sources */,
7037+
729357F42DDBD3F80001D03C /* MSIDNonceTokenRequestTest.m in Sources */,
70177038
23FB5C20225516FB002BF1EB /* MSIDClaimsRequestTests.m in Sources */,
70187039
656E666129BD81B000368F0A /* MSIDAADEndpointProviderTests.m in Sources */,
70197040
1E65C47B2177DC8B00694293 /* MSIDAppMetadataCacheKeyTests.m in Sources */,
@@ -7254,6 +7275,7 @@
72547275
B2C7089421991CED00D917B8 /* MSIDAADV1BrokerResponse.m in Sources */,
72557276
B229841629A9C2930005F83D /* MSIDExternalSSOContext.m in Sources */,
72567277
B2C07483246B70F70008D701 /* MSIDAssymetricKeyPair.m in Sources */,
7278+
729357EB2DD810D00001D03C /* MSIDNonceTokenRequest.m in Sources */,
72577279
B266903F243706DB00FB0117 /* MSIDBrokerBrowserOperationResponse.m in Sources */,
72587280
B2AF1D3A218BCF140080C1A0 /* MSIDRequestControllerFactory.m in Sources */,
72597281
B28BDAC1221F7F230055FFE6 /* MSIDCBAWebAADAuthResponse.m in Sources */,
@@ -7720,6 +7742,7 @@
77207742
B280800B204CD81400944D89 /* MSIDLegacyCacheKeyTests.m in Sources */,
77217743
B210F44F1FDDF5D2005A8F76 /* MSIDClientInfoTests.m in Sources */,
77227744
9668B6F82148796A0039AB0A /* MSIDDataExtensionsTests.m in Sources */,
7745+
729357F32DDBD3F80001D03C /* MSIDNonceTokenRequestTest.m in Sources */,
77237746
B2936F7D20ABF9570050C585 /* MSIDLegacyRefreshTokenTests.m in Sources */,
77247747
B253BD7A20487C8A00D07F31 /* MSIDLegacyTokenCacheIntegrationTests.m in Sources */,
77257748
B2544EEC21684B2B00B4C108 /* MSIDCacheSchemaValidationTests.m in Sources */,
@@ -7789,6 +7812,7 @@
77897812
B2BE925421A24B8200F5AB8C /* MSIDTestTokenRequestProvider.m in Sources */,
77907813
23FB5C3A225588D0002BF1EB /* MSIDClaimsRequestMock.m in Sources */,
77917814
B217861A23A57EDC00839CE8 /* MSIDAuthorizationControllerMock.m in Sources */,
7815+
729357EF2DDBCBAE0001D03C /* MSIDNonceTokenRequestMock.m in Sources */,
77927816
B2BE926921A25F8300F5AB8C /* MSIDTestBrokerResponseHandler.m in Sources */,
77937817
583BFCB624D908980035B901 /* MSIDTestBundle.m in Sources */,
77947818
58D1514324A6888D001DD18A /* MSIDHttpRequest+OverrideCacheSave.m in Sources */,
@@ -7846,6 +7870,7 @@
78467870
B2E4A06E24DDE559007CE642 /* MSIDTestContext.m in Sources */,
78477871
B245C2FB2106ABDC00CD5A52 /* MSIDTestIdTokenUtil.m in Sources */,
78487872
B2E4A07124DDE568007CE642 /* MSIDTestCacheAccessorHelper.m in Sources */,
7873+
729357F02DDBCBAE0001D03C /* MSIDNonceTokenRequestMock.m in Sources */,
78497874
B233F8BC219CE03F00DC90E3 /* MSIDTestURLResponse+Util.m in Sources */,
78507875
B2968CA922F67B4C005AFC33 /* MSIDTestLocalInteractiveController.m in Sources */,
78517876
B2BE923D21A0FD2B00F5AB8C /* MSIDTestSwizzle.m in Sources */,
@@ -8046,6 +8071,7 @@
80468071
23BDA67A1FCE693800FE14BE /* MSIDKeychainUtil.m in Sources */,
80478072
23AB37EA235151E5003A6E6C /* ASAuthorizationSingleSignOnProvider+MSIDExtensions.m in Sources */,
80488073
B2AF1D4B218BD12E0080C1A0 /* MSIDInteractiveRequestParameters.m in Sources */,
8074+
729357EA2DD810D00001D03C /* MSIDNonceTokenRequest.m in Sources */,
80498075
B2C707FE2192530E00D917B8 /* MSIDDefaultSilentTokenRequest.m in Sources */,
80508076
23B5DF77234030B2002C530F /* MSIDRequestParameters+Broker.m in Sources */,
80518077
23B37D1B20C9ECFB0018722F /* MSIDCache.m in Sources */,
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// Copyright (c) Microsoft Corporation.
3+
// All rights reserved.
4+
//
5+
// This code is licensed under the MIT License.
6+
//
7+
// Permission is hereby granted, free of charge, to any person obtaining a copy
8+
// of this software and associated documentation files(the "Software"), to deal
9+
// in the Software without restriction, including without limitation the rights
10+
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
11+
// copies of the Software, and to permit persons to whom the Software is
12+
// furnished to do so, subject to the following conditions :
13+
//
14+
// The above copyright notice and this permission notice shall be included in
15+
// all copies or substantial portions of the Software.
16+
//
17+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
// THE SOFTWARE.
24+
25+
@class MSIDRequestParameters;
26+
const static NSUInteger kMSIDNonceLifetimeInSeconds = 180;
27+
28+
@interface MSIDCachedNonce : NSObject
29+
30+
@property (nonatomic, readonly, nonnull) NSString *nonce;
31+
@property (nonatomic, readonly, nonnull) NSDate *cachedDate;
32+
33+
- (_Nonnull instancetype)init NS_UNAVAILABLE;
34+
+ (_Nonnull instancetype)new NS_UNAVAILABLE;
35+
- (_Nonnull instancetype)initWithNonce:(nonnull NSString *)nonce;
36+
37+
@end
38+
39+
typedef void (^MSIDNonceRequestCompletion)(NSString * _Nullable resultNonce, NSError * _Nullable error);
40+
41+
NS_ASSUME_NONNULL_BEGIN
42+
43+
@interface MSIDNonceTokenRequest : NSObject
44+
45+
@property (nonatomic, readonly, nonnull) MSIDRequestParameters *requestParameters;
46+
47+
- (nullable instancetype)initWithRequestParameters:(nonnull MSIDRequestParameters *)parameters;
48+
49+
- (void)executeRequestWithCompletion:(nonnull MSIDNonceRequestCompletion)completionBlock;
50+
51+
@end
52+
53+
NS_ASSUME_NONNULL_END
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
//
2+
// Copyright (c) Microsoft Corporation.
3+
// All rights reserved.
4+
//
5+
// This code is licensed under the MIT License.
6+
//
7+
// Permission is hereby granted, free of charge, to any person obtaining a copy
8+
// of this software and associated documentation files(the "Software"), to deal
9+
// in the Software without restriction, including without limitation the rights
10+
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
11+
// copies of the Software, and to permit persons to whom the Software is
12+
// furnished to do so, subject to the following conditions :
13+
//
14+
// The above copyright notice and this permission notice shall be included in
15+
// all copies or substantial portions of the Software.
16+
//
17+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
// THE SOFTWARE.
24+
25+
#import "MSIDNonceTokenRequest.h"
26+
#import "MSIDRequestParameters.h"
27+
#import "MSIDAuthority.h"
28+
#import "MSIDOpenIdProviderMetadata.h"
29+
#import "MSIDAccountIdentifier.h"
30+
#import "MSIDHttpRequest.h"
31+
#import "MSIDAADRequestConfigurator.h"
32+
33+
@implementation MSIDNonceTokenRequest
34+
35+
- (nullable instancetype)initWithRequestParameters:(nonnull MSIDRequestParameters *)parameters
36+
{
37+
self = [super init];
38+
39+
if (self)
40+
{
41+
_requestParameters = parameters;
42+
}
43+
44+
return self;
45+
}
46+
47+
- (void)executeRequestWithCompletion:(nonnull MSIDNonceRequestCompletion)completionBlock
48+
{
49+
MSIDCachedNonce *cachedNonce = [self.class getCachedNonceForKey:_requestParameters.authority.environment];
50+
if (cachedNonce)
51+
{
52+
completionBlock(cachedNonce.nonce, nil);
53+
return;
54+
}
55+
56+
if (_requestParameters.authority.metadata.tokenEndpoint)
57+
{
58+
[self executeNetworkRequestWithCompletion:completionBlock];
59+
return;
60+
}
61+
62+
[_requestParameters.authority resolveAndValidate:YES
63+
userPrincipalName:_requestParameters.accountIdentifier.displayableId
64+
context:_requestParameters
65+
completionBlock:^(NSURL __unused *openIdConfigurationEndpoint, BOOL __unused validated, NSError *error)
66+
{
67+
if (error)
68+
{
69+
completionBlock(nil, error);
70+
return;
71+
}
72+
73+
[self->_requestParameters.authority loadOpenIdMetadataWithContext:self->_requestParameters
74+
completionBlock:^(__unused MSIDOpenIdProviderMetadata *metadata, NSError *openIdError)
75+
{
76+
77+
if (openIdError)
78+
{
79+
completionBlock(nil, openIdError);
80+
return;
81+
}
82+
83+
[self executeNetworkRequestWithCompletion:completionBlock];
84+
}];
85+
}];
86+
}
87+
88+
- (void)executeNetworkRequestWithCompletion:(nonnull MSIDNonceRequestCompletion)completionBlock
89+
{
90+
MSIDHttpRequest *nonceRequest = [self configureNonceNetworkRequestForEndpoint:self.requestParameters.tokenEndpoint context:self.requestParameters];
91+
[nonceRequest sendWithBlock:^(NSDictionary *response, NSError *error) {
92+
93+
if (error)
94+
{
95+
if (completionBlock) completionBlock(nil, error);
96+
return;
97+
}
98+
99+
if (![response isKindOfClass:[NSDictionary class]])
100+
{
101+
MSID_LOG_WITH_CTX(MSIDLogLevelError, self.requestParameters, @"Unexpected nonce response received");
102+
NSError *nwError = MSIDCreateError(MSIDErrorDomain, MSIDErrorServerInvalidResponse, @"Unexpected nonce response", nil, nil, nil, nil, nil, YES);
103+
if (completionBlock) completionBlock(nil, nwError);
104+
return;
105+
}
106+
107+
NSString *nonce = [response msidStringObjectForKey:@"Nonce"];
108+
109+
if ([NSString msidIsStringNilOrBlank:nonce])
110+
{
111+
MSID_LOG_WITH_CTX(MSIDLogLevelError, self.requestParameters, @"Didn't receive valid nonce in response");
112+
NSError *nwError = MSIDCreateError(MSIDErrorDomain, MSIDErrorServerInvalidResponse, @"Didn't receive valid nonce in response", nil, nil, nil, nil, nil, YES);
113+
if (completionBlock) completionBlock(nil, nwError);
114+
return;
115+
}
116+
117+
[self.class cacheNonceForKey:self.requestParameters.authority.environment nonce:nonce];
118+
if (completionBlock)
119+
{
120+
completionBlock(nonce, nil);
121+
}
122+
}];
123+
}
124+
125+
- (MSIDHttpRequest *)configureNonceNetworkRequestForEndpoint:(NSURL *)endpoint context:(id<MSIDRequestContext>)context
126+
{
127+
if (!endpoint)
128+
{
129+
MSID_LOG_WITH_CTX(MSIDLogLevelError, context, @"No endpoint provided to get nonce from!");
130+
NSParameterAssert(endpoint);
131+
return nil;
132+
}
133+
134+
MSIDHttpRequest *request = [[MSIDHttpRequest alloc] init];
135+
NSMutableURLRequest *urlRequest = [NSMutableURLRequest new];
136+
urlRequest.URL = endpoint;
137+
urlRequest.HTTPMethod = @"POST";
138+
request.urlRequest = urlRequest;
139+
140+
__auto_type requestConfigurator = [MSIDAADRequestConfigurator new];
141+
[requestConfigurator configure:request];
142+
143+
NSMutableDictionary *parameters = [NSMutableDictionary new];
144+
145+
parameters[MSID_OAUTH2_GRANT_TYPE] = @"srv_challenge";
146+
[parameters addEntriesFromDictionary:parameters];
147+
request.parameters = parameters;
148+
request.urlRequest = urlRequest;
149+
return request;
150+
}
151+
152+
153+
#pragma mark - Cache
154+
155+
+ (MSIDCache *)nonceCache
156+
{
157+
static MSIDCache *k_nonceCache;
158+
static dispatch_once_t once_token;
159+
dispatch_once(&once_token, ^{
160+
k_nonceCache = [MSIDCache new];
161+
});
162+
163+
return k_nonceCache;
164+
}
165+
166+
+ (nullable MSIDCachedNonce *)getCachedNonceForKey:(NSString *)key
167+
{
168+
MSIDCache *cache = [self.class nonceCache];
169+
MSIDCachedNonce *cachedNonce = [cache objectForKey:key];
170+
if (cachedNonce)
171+
{
172+
NSTimeInterval ti = [[NSDate date] timeIntervalSinceDate:cachedNonce.cachedDate];
173+
if (ti > 0 && ti < kMSIDNonceLifetimeInSeconds)
174+
{
175+
return cachedNonce;
176+
}
177+
}
178+
179+
return nil;
180+
}
181+
182+
+ (BOOL)cacheNonceForKey:(NSString *)key nonce:(NSString *)nonce
183+
{
184+
if (!nonce || !key)
185+
{
186+
return NO;
187+
}
188+
189+
MSIDCachedNonce *cachedNonce = [[MSIDCachedNonce alloc] initWithNonce:nonce];
190+
[self.class.nonceCache setObject:cachedNonce forKey:key];
191+
return YES;
192+
}
193+
@end
194+
195+
@implementation MSIDCachedNonce
196+
197+
- (instancetype)initWithNonce:(NSString *)nonce
198+
{
199+
self = [super init];
200+
if (self)
201+
{
202+
_nonce = nonce;
203+
_cachedDate = [NSDate date];
204+
}
205+
return self;
206+
}
207+
@end

0 commit comments

Comments
 (0)