Skip to content

Commit 36c1df0

Browse files
break2kDTalij
andauthored
introduce addtional http headers to OIDTokenRequest (#770)
Co-authored-by: Vitalij Dadaschjanz <[email protected]>
1 parent 71cde44 commit 36c1df0

20 files changed

+303
-46
lines changed

Examples/Example-iOS_ObjC-Carthage/Source/AppAuthExampleViewController.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ - (void)doClientRegistration:(OIDServiceConfiguration *)configuration
177177
grantTypes:nil
178178
subjectType:nil
179179
tokenEndpointAuthMethod:@"client_secret_post"
180-
additionalParameters:nil];
180+
additionalParameters:nil
181+
additionalHeaders:nil];
181182
// performs registration request
182183
[self logMessage:@"Initiating registration request"];
183184

Examples/Example-iOS_ObjC/Source/AppAuthExampleViewController.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ - (void)doClientRegistration:(OIDServiceConfiguration *)configuration
179179
grantTypes:nil
180180
subjectType:nil
181181
tokenEndpointAuthMethod:@"client_secret_post"
182-
additionalParameters:nil];
182+
additionalParameters:nil
183+
additionalHeaders:nil];
183184
// performs registration request
184185
[self logMessage:@"Initiating registration request"];
185186

Examples/Example-iOS_Swift-Carthage/Source/AppAuthExampleViewController.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ extension AppAuthExampleViewController {
349349
grantTypes: nil,
350350
subjectType: nil,
351351
tokenEndpointAuthMethod: "client_secret_post",
352-
additionalParameters: nil)
352+
additionalParameters: nil,
353+
additionalHeaders: nil)
353354

354355
// performs registration request
355356
self.logMessage("Initiating registration request")

Examples/Example-tvOS/Example-tvOS/AppAuthTVExampleViewController.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ - (void)performAuthorizationWithConfiguration:(OIDTVServiceConfiguration *)confi
176176
clientId:kClientID
177177
clientSecret:kClientSecret
178178
scopes:@[ OIDScopeOpenID, OIDScopeProfile ]
179-
additionalParameters:nil];
179+
additionalParameters:nil
180+
additionalHeaders:nil];
180181

181182
OIDTVAuthorizationInitialization initBlock =
182183
^(OIDTVAuthorizationResponse *_Nullable response, NSError *_Nullable error) {

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,8 @@ OIDTVAuthorizationRequest *request =
516516
clientId:kClientID
517517
clientSecret:kClientSecret
518518
scopes:@[ OIDScopeOpenID, OIDScopeProfile ]
519-
additionalParameters:nil];
519+
additionalParameters:nil
520+
additionalHeaders:nil];
520521

521522
// performs authentication request
522523
OIDTVAuthorizationInitialization initBlock =

Source/AppAuthCore/OIDAuthState.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ typedef void (^OIDAuthStateAction)(NSString *_Nullable accessToken,
4848
typedef void (^OIDAuthStateAuthorizationCallback)(OIDAuthState *_Nullable authState,
4949
NSError *_Nullable error);
5050

51+
/*! @brief The exception thrown when a developer tries to create a refresh request from an
52+
authorization request with no authorization code.
53+
*/
54+
static NSString *const kRefreshTokenRequestException =
55+
@"Attempted to create a token refresh request from a token response with no refresh token.";
56+
5157
/*! @brief A convenience class that retains the auth state between @c OIDAuthorizationResponse%s
5258
and @c OIDTokenResponse%s.
5359
*/
@@ -267,6 +273,31 @@ typedef void (^OIDAuthStateAuthorizationCallback)(OIDAuthState *_Nullable authSt
267273
- (nullable OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters:
268274
(nullable NSDictionary<NSString *, NSString *> *)additionalParameters;
269275

276+
/*! @brief Creates a token request suitable for refreshing an access token.
277+
@param additionalParameters Additional parameters for the token request.
278+
@param additionalHeaders Additional headers for the token request.
279+
@return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token.
280+
@discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error:
281+
to update the authorization state based on the response. Rather than doing the token refresh
282+
yourself, you should use @c OIDAuthState.performActionWithFreshTokens:.
283+
@see https://tools.ietf.org/html/rfc6749#section-1.5
284+
*/
285+
- (nullable OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters:
286+
(nullable NSDictionary<NSString *, NSString *> *)additionalParameters
287+
additionalHeaders:
288+
(nullable NSDictionary<NSString *, NSString *> *)additionalHeaders;
289+
290+
/*! @brief Creates a token request suitable for refreshing an access token.
291+
@param additionalHeaders Additional parameters for the token request.
292+
@return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token.
293+
@discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error:
294+
to update the authorization state based on the response. Rather than doing the token refresh
295+
yourself, you should use @c OIDAuthState.performActionWithFreshTokens:.
296+
@see https://tools.ietf.org/html/rfc6749#section-1.5
297+
*/
298+
- (nullable OIDTokenRequest *)tokenRefreshRequestWithAdditionalHeaders:
299+
(nullable NSDictionary<NSString *, NSString *> *)additionalHeaders;
300+
270301
@end
271302

272303
NS_ASSUME_NONNULL_END

Source/AppAuthCore/OIDAuthState.m

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,6 @@
5555
*/
5656
static NSString *const kAuthorizationErrorKey = @"authorizationError";
5757

58-
/*! @brief The exception thrown when a developer tries to create a refresh request from an
59-
authorization request with no authorization code.
60-
*/
61-
static NSString *const kRefreshTokenRequestException =
62-
@"Attempted to create a token refresh request from a token response with no refresh token.";
63-
6458
/*! @brief Number of seconds the access token is refreshed before it actually expires.
6559
*/
6660
static const NSUInteger kExpiryTimeTolerance = 60;
@@ -427,7 +421,47 @@ - (OIDTokenRequest *)tokenRefreshRequest {
427421
- (OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters:
428422
(NSDictionary<NSString *, NSString *> *)additionalParameters {
429423

430-
// TODO: Add unit test to confirm exception is thrown when expected
424+
if (!_refreshToken) {
425+
[OIDErrorUtilities raiseException:kRefreshTokenRequestException];
426+
}
427+
return [[OIDTokenRequest alloc]
428+
initWithConfiguration:_lastAuthorizationResponse.request.configuration
429+
grantType:OIDGrantTypeRefreshToken
430+
authorizationCode:nil
431+
redirectURL:nil
432+
clientID:_lastAuthorizationResponse.request.clientID
433+
clientSecret:_lastAuthorizationResponse.request.clientSecret
434+
scope:nil
435+
refreshToken:_refreshToken
436+
codeVerifier:nil
437+
additionalParameters:additionalParameters
438+
additionalHeaders:nil];
439+
}
440+
441+
- (OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters:
442+
(NSDictionary<NSString *, NSString *> *)additionalParameters
443+
additionalHeaders:
444+
(NSDictionary<NSString *,NSString *> *)additionalHeaders {
445+
446+
if (!_refreshToken) {
447+
[OIDErrorUtilities raiseException:kRefreshTokenRequestException];
448+
}
449+
return [[OIDTokenRequest alloc]
450+
initWithConfiguration:_lastAuthorizationResponse.request.configuration
451+
grantType:OIDGrantTypeRefreshToken
452+
authorizationCode:nil
453+
redirectURL:nil
454+
clientID:_lastAuthorizationResponse.request.clientID
455+
clientSecret:_lastAuthorizationResponse.request.clientSecret
456+
scope:nil
457+
refreshToken:_refreshToken
458+
codeVerifier:nil
459+
additionalParameters:additionalParameters
460+
additionalHeaders:additionalHeaders];
461+
}
462+
463+
- (OIDTokenRequest *)tokenRefreshRequestWithAdditionalHeaders:
464+
(NSDictionary<NSString *, NSString *> *)additionalHeaders {
431465

432466
if (!_refreshToken) {
433467
[OIDErrorUtilities raiseException:kRefreshTokenRequestException];
@@ -442,7 +476,8 @@ - (OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters:
442476
scope:nil
443477
refreshToken:_refreshToken
444478
codeVerifier:nil
445-
additionalParameters:additionalParameters];
479+
additionalParameters:nil
480+
additionalHeaders:additionalHeaders];
446481
}
447482

448483
#pragma mark - Stateful Actions

Source/AppAuthCore/OIDAuthorizationResponse.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ NS_ASSUME_NONNULL_BEGIN
121121
@see https://tools.ietf.org/html/rfc6749#section-4.1.3
122122
*/
123123
- (nullable OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters:
124-
(nullable NSDictionary<NSString *, NSString *> *)additionalParameters;
124+
(nullable NSDictionary<NSString *, NSString *> *)additionalParameters
125+
additionalHeaders:
126+
(nullable NSDictionary<NSString *, NSString *> *)additionalHeaders;
125127

126128
@end
127129

Source/AppAuthCore/OIDAuthorizationResponse.m

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,13 @@ - (NSString *)description {
184184
#pragma mark -
185185

186186
- (OIDTokenRequest *)tokenExchangeRequest {
187-
return [self tokenExchangeRequestWithAdditionalParameters:nil];
187+
return [self tokenExchangeRequestWithAdditionalParameters:nil additionalHeaders:nil];
188188
}
189189

190190
- (OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters:
191-
(NSDictionary<NSString *, NSString *> *)additionalParameters {
191+
(NSDictionary<NSString *, NSString *> *)additionalParameters
192+
additionalHeaders:
193+
(NSDictionary<NSString *, NSString *> *)additionalHeaders {
192194
// TODO: add a unit test to confirm exception is thrown when expected and the request is created
193195
// with the correct parameters.
194196
if (!_authorizationCode) {
@@ -204,7 +206,8 @@ - (OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters:
204206
scope:nil
205207
refreshToken:nil
206208
codeVerifier:_request.codeVerifier
207-
additionalParameters:additionalParameters];
209+
additionalParameters:additionalParameters
210+
additionalHeaders:additionalHeaders];
208211
}
209212

210213
@end

Source/AppAuthCore/OIDTokenRequest.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,13 @@ NS_ASSUME_NONNULL_BEGIN
9595
*/
9696
@property(nonatomic, readonly, nullable) NSDictionary<NSString *, NSString *> *additionalParameters;
9797

98+
/*! @brief The client's additional token request headers.
99+
*/
100+
@property(nonatomic, readonly, nullable) NSDictionary<NSString *, NSString *> *additionalHeaders;
101+
98102
/*! @internal
99103
@brief Unavailable. Please use
100-
initWithConfiguration:grantType:code:redirectURL:clientID:additionalParameters:.
104+
initWithConfiguration:grantType:code:redirectURL:clientID:additionalParameters:additionalHeaders:.
101105
*/
102106
- (instancetype)init NS_UNAVAILABLE;
103107

@@ -113,6 +117,7 @@ NS_ASSUME_NONNULL_BEGIN
113117
@param refreshToken The refresh token.
114118
@param codeVerifier The PKCE code verifier.
115119
@param additionalParameters The client's additional token request parameters.
120+
@param additionalHeaders The client's additional token request headers.
116121
*/
117122
- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration
118123
grantType:(NSString *)grantType
@@ -123,7 +128,8 @@ NS_ASSUME_NONNULL_BEGIN
123128
scopes:(nullable NSArray<NSString *> *)scopes
124129
refreshToken:(nullable NSString *)refreshToken
125130
codeVerifier:(nullable NSString *)codeVerifier
126-
additionalParameters:(nullable NSDictionary<NSString *, NSString *> *)additionalParameters;
131+
additionalParameters:(nullable NSDictionary<NSString *, NSString *> *)additionalParameters
132+
additionalHeaders:(nullable NSDictionary<NSString *, NSString *> *)additionalHeaders;
127133

128134
/*! @brief Designated initializer.
129135
@param configuration The service's configuration.
@@ -139,6 +145,7 @@ NS_ASSUME_NONNULL_BEGIN
139145
@param refreshToken The refresh token.
140146
@param codeVerifier The PKCE code verifier.
141147
@param additionalParameters The client's additional token request parameters.
148+
@param additionalHeaders The client's additional token request headers.
142149
*/
143150
- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration
144151
grantType:(NSString *)grantType
@@ -150,6 +157,7 @@ NS_ASSUME_NONNULL_BEGIN
150157
refreshToken:(nullable NSString *)refreshToken
151158
codeVerifier:(nullable NSString *)codeVerifier
152159
additionalParameters:(nullable NSDictionary<NSString *, NSString *> *)additionalParameters
160+
additionalHeaders:(nullable NSDictionary<NSString *, NSString *> *)additionalHeaders
153161
NS_DESIGNATED_INITIALIZER;
154162

155163
/*! @brief Designated initializer for NSSecureCoding.

0 commit comments

Comments
 (0)