You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

163 lines
5.4 KiB

/*
* 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 "FIRSecureTokenRequest.h"
#import "FIRAuthRequestConfiguration.h"
NS_ASSUME_NONNULL_BEGIN
/** @var kFIRSecureTokenServiceGetTokenURLFormat
@brief The format of the secure token service URLs. Requires string format substitution with
the client's API Key.
*/
static NSString *const kFIRSecureTokenServiceGetTokenURLFormat = @"https://%@/v1/token?key=%@";
/** @var kFIRSecureTokenServiceGrantTypeRefreshToken
@brief The string value of the @c FIRSecureTokenRequestGrantTypeRefreshToken request type.
*/
static NSString *const kFIRSecureTokenServiceGrantTypeRefreshToken = @"refresh_token";
/** @var kFIRSecureTokenServiceGrantTypeAuthorizationCode
@brief The string value of the @c FIRSecureTokenRequestGrantTypeAuthorizationCode request type.
*/
static NSString *const kFIRSecureTokenServiceGrantTypeAuthorizationCode = @"authorization_code";
/** @var kGrantTypeKey
@brief The key for the "grantType" parameter in the request.
*/
static NSString *const kGrantTypeKey = @"grantType";
/** @var kScopeKey
@brief The key for the "scope" parameter in the request.
*/
static NSString *const kScopeKey = @"scope";
/** @var kRefreshTokenKey
@brief The key for the "refreshToken" parameter in the request.
*/
static NSString *const kRefreshTokenKey = @"refreshToken";
/** @var kCodeKey
@brief The key for the "code" parameter in the request.
*/
static NSString *const kCodeKey = @"code";
/** @var gAPIHost
@brief Host for server API calls.
*/
static NSString *gAPIHost = @"securetoken.googleapis.com";
@implementation FIRSecureTokenRequest {
/** @var _requestConfiguration
@brief Contains configuration relevant to the request.
*/
FIRAuthRequestConfiguration *_requestConfiguration;
}
+ (FIRSecureTokenRequest *)authCodeRequestWithCode:(NSString *)code
requestConfiguration:(FIRAuthRequestConfiguration *)
requestConfiguration {
return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeAuthorizationCode
scope:nil
refreshToken:nil
code:code
requestConfiguration:requestConfiguration];
}
+ (FIRSecureTokenRequest *)refreshRequestWithRefreshToken:(NSString *)refreshToken
requestConfiguration:(FIRAuthRequestConfiguration *)
requestConfiguration {
return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeRefreshToken
scope:nil
refreshToken:refreshToken
code:nil
requestConfiguration:requestConfiguration];
}
/** @fn grantTypeStringWithGrantType:
@brief Converts a @c FIRSecureTokenRequestGrantType to it's @c NSString equivilent.
*/
+ (NSString *)grantTypeStringWithGrantType:(FIRSecureTokenRequestGrantType)grantType {
switch (grantType) {
case FIRSecureTokenRequestGrantTypeAuthorizationCode:
return kFIRSecureTokenServiceGrantTypeAuthorizationCode;
case FIRSecureTokenRequestGrantTypeRefreshToken:
return kFIRSecureTokenServiceGrantTypeRefreshToken;
// No Default case so we will notice if new grant types are added to the enum.
}
}
- (nullable instancetype)initWithGrantType:(FIRSecureTokenRequestGrantType)grantType
scope:(nullable NSString *)scope
refreshToken:(nullable NSString *)refreshToken
code:(nullable NSString *)code
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
self = [super init];
if (self) {
_grantType = grantType;
_scope = [scope copy];
_refreshToken = [refreshToken copy];
_code = [code copy];
_APIKey = [requestConfiguration.APIKey copy];
_requestConfiguration = requestConfiguration;
}
return self;
}
- (FIRAuthRequestConfiguration *)requestConfiguration {
return _requestConfiguration;
}
- (NSURL *)requestURL {
NSString *URLString =
[NSString stringWithFormat:kFIRSecureTokenServiceGetTokenURLFormat, gAPIHost, _APIKey];
NSURL *URL = [NSURL URLWithString:URLString];
return URL;
}
- (BOOL)containsPostBody {
return YES;
}
- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
NSMutableDictionary *postBody = [@{
kGrantTypeKey : [[self class] grantTypeStringWithGrantType:_grantType]
} mutableCopy];
if (_scope) {
postBody[kScopeKey] = _scope;
}
if (_refreshToken) {
postBody[kRefreshTokenKey] = _refreshToken;
}
if (_code) {
postBody[kCodeKey] = _code;
}
return postBody;
}
#pragma mark - Internal API for development
+ (NSString *)host {
return gAPIHost;
}
+ (void)setHost:(NSString *)host {
gAPIHost = host;
}
@end
NS_ASSUME_NONNULL_END