From 8e6492af9e0cb5155e1121218968d21f4531f147 Mon Sep 17 00:00:00 2001 From: noppoman Date: Thu, 31 Aug 2017 13:15:52 +0900 Subject: [PATCH] add blockForCallbackURLQueryParams to OAuth2 --- Sources/HexavilleAuth/HexavilleAuth+Router.swift | 4 ++-- Sources/HexavilleAuth/OAuth/OAuth2.swift | 10 ++++++---- .../OAuth2/FacebookAuthorizationProvider.swift | 4 ++-- .../OAuth2/GithubAuthorizationProvider.swift | 4 ++-- .../OAuth2/GoogleAuthorizationProvider.swift | 4 ++-- .../OAuth2/InstagramAuthorizationProvider.swift | 4 ++-- .../Providers/OAuth2AuthorizationProvidable.swift | 12 ++++++------ 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Sources/HexavilleAuth/HexavilleAuth+Router.swift b/Sources/HexavilleAuth/HexavilleAuth+Router.swift index 16e86d4..c915d9f 100644 --- a/Sources/HexavilleAuth/HexavilleAuth+Router.swift +++ b/Sources/HexavilleAuth/HexavilleAuth+Router.swift @@ -53,13 +53,13 @@ extension HexavilleAuth { return Response( status: .found, headers: [ - "Location": try provider.createAuthorizeURL().absoluteString + "Location": try provider.createAuthorizeURL(withCallbackURLQueryItems: request.queryItems).absoluteString ] ) } router.use(.get, provider.oauth.callbackURL.path) { request, context in - let (cred, user) = try provider.authorize(request: request) + let (cred, user) = try provider.authorize(for: request) context.session?[AuthenticationMiddleware.sessionKey] = user.serialize() return try provider.callback(cred, user, request, context) } diff --git a/Sources/HexavilleAuth/OAuth/OAuth2.swift b/Sources/HexavilleAuth/OAuth/OAuth2.swift index d893fe4..327c826 100644 --- a/Sources/HexavilleAuth/OAuth/OAuth2.swift +++ b/Sources/HexavilleAuth/OAuth/OAuth2.swift @@ -20,15 +20,17 @@ public class OAuth2 { var accessTokenURL: String? let responseType: String let callbackURL: CallbackURL + let blockForCallbackURLQueryParams: ((Request) -> [URLQueryItem])? let scope: String - public init(consumerKey: String, consumerSecret: String, authorizeURL: String, accessTokenURL: String? = nil, responseType: String = "code", callbackURL: CallbackURL, scope: String) { + public init(consumerKey: String, consumerSecret: String, authorizeURL: String, accessTokenURL: String? = nil, responseType: String = "code", callbackURL: CallbackURL, blockForCallbackURLQueryParams: ((Request) -> [URLQueryItem])? = nil, scope: String) { self.consumerKey = consumerKey self.consumerSecret = consumerSecret self.authorizeURL = authorizeURL self.accessTokenURL = accessTokenURL self.responseType = responseType self.scope = scope + self.blockForCallbackURLQueryParams = blockForCallbackURLQueryParams self.callbackURL = callbackURL } @@ -36,10 +38,10 @@ public class OAuth2 { return dict.map({ "\($0.key)=\($0.value)" }).joined(separator: "&") } - public func createAuthorizeURL() throws -> URL { + public func createAuthorizeURL(withCallbackURLQueryItems queryItems: [URLQueryItem]) throws -> URL { let params = [ "client_id": consumerKey, - "redirect_uri": callbackURL.absoluteURL()!.absoluteString, + "redirect_uri": callbackURL.absoluteURL(withQueryItems: queryItems)!.absoluteString, "response_type": responseType, "scope": scope ] @@ -53,7 +55,7 @@ public class OAuth2 { return url } - public func getAccessToken(request: Request) throws -> Credential { + public func getAccessToken(for request: Request) throws -> Credential { guard let code = request.queryItems.filter({ $0.name == "code" }).first?.value else { throw HexavilleAuthError.codeIsMissingInResponseParameters } diff --git a/Sources/HexavilleAuth/Providers/OAuth2/FacebookAuthorizationProvider.swift b/Sources/HexavilleAuth/Providers/OAuth2/FacebookAuthorizationProvider.swift index ea33c85..7b34e5b 100644 --- a/Sources/HexavilleAuth/Providers/OAuth2/FacebookAuthorizationProvider.swift +++ b/Sources/HexavilleAuth/Providers/OAuth2/FacebookAuthorizationProvider.swift @@ -36,8 +36,8 @@ public struct FacebookAuthorizationProvider: OAuth2AuthorizationProvidable { self.callback = callback } - public func authorize(request: Request) throws -> (Credential, LoginUser) { - let credential = try self.getAccessToken(request: request) + public func authorize(for request: Request) throws -> (Credential, LoginUser) { + let credential = try self.getAccessToken(for: request) let request = Request( method: .get, diff --git a/Sources/HexavilleAuth/Providers/OAuth2/GithubAuthorizationProvider.swift b/Sources/HexavilleAuth/Providers/OAuth2/GithubAuthorizationProvider.swift index 840e550..fa7612c 100644 --- a/Sources/HexavilleAuth/Providers/OAuth2/GithubAuthorizationProvider.swift +++ b/Sources/HexavilleAuth/Providers/OAuth2/GithubAuthorizationProvider.swift @@ -36,8 +36,8 @@ public struct GithubAuthorizationProvider: OAuth2AuthorizationProvidable { self.callback = callback } - public func authorize(request: Request) throws -> (Credential, LoginUser) { - let credential = try self.getAccessToken(request: request) + public func authorize(for request: Request) throws -> (Credential, LoginUser) { + let credential = try self.getAccessToken(for: request) let request = Request( method: .get, diff --git a/Sources/HexavilleAuth/Providers/OAuth2/GoogleAuthorizationProvider.swift b/Sources/HexavilleAuth/Providers/OAuth2/GoogleAuthorizationProvider.swift index 93c9d4b..9397847 100644 --- a/Sources/HexavilleAuth/Providers/OAuth2/GoogleAuthorizationProvider.swift +++ b/Sources/HexavilleAuth/Providers/OAuth2/GoogleAuthorizationProvider.swift @@ -34,8 +34,8 @@ public struct GoogleAuthorizationProvider: OAuth2AuthorizationProvidable { // TODO: // not implemented yet - public func authorize(request: Request) throws -> (Credential, LoginUser) { - let credential = try self.getAccessToken(request: request) + public func authorize(for request: Request) throws -> (Credential, LoginUser) { + let credential = try self.getAccessToken(for: request) let user = LoginUser(id: "", name: "") return (credential, user) } diff --git a/Sources/HexavilleAuth/Providers/OAuth2/InstagramAuthorizationProvider.swift b/Sources/HexavilleAuth/Providers/OAuth2/InstagramAuthorizationProvider.swift index b154b49..ce1f625 100644 --- a/Sources/HexavilleAuth/Providers/OAuth2/InstagramAuthorizationProvider.swift +++ b/Sources/HexavilleAuth/Providers/OAuth2/InstagramAuthorizationProvider.swift @@ -35,8 +35,8 @@ public struct InstagramAuthorizationProvider: OAuth2AuthorizationProvidable { // TODO: // not implemented yet - public func authorize(request: Request) throws -> (Credential, LoginUser) { - let credential = try self.getAccessToken(request: request) + public func authorize(for request: Request) throws -> (Credential, LoginUser) { + let credential = try self.getAccessToken(for: request) let user = LoginUser(id: "", name: "") return (credential, user) } diff --git a/Sources/HexavilleAuth/Providers/OAuth2AuthorizationProvidable.swift b/Sources/HexavilleAuth/Providers/OAuth2AuthorizationProvidable.swift index 394a0d4..6211460 100644 --- a/Sources/HexavilleAuth/Providers/OAuth2AuthorizationProvidable.swift +++ b/Sources/HexavilleAuth/Providers/OAuth2AuthorizationProvidable.swift @@ -16,16 +16,16 @@ public protocol OAuth2AuthorizationProvidable { var oauth: OAuth2 { get } var callback: RespodWithCredential { get } init(path: String, consumerKey: String, consumerSecret: String, callbackURL: CallbackURL, scope: String, callback: @escaping RespodWithCredential) - func getAccessToken(request: Request) throws -> Credential - func authorize(request: Request) throws -> (Credential, LoginUser) + func getAccessToken(for: Request) throws -> Credential + func authorize(for: Request) throws -> (Credential, LoginUser) } extension OAuth2AuthorizationProvidable { - public func createAuthorizeURL() throws -> URL { - return try oauth.createAuthorizeURL() + public func createAuthorizeURL(withCallbackURLQueryItems queryItems: [URLQueryItem]) throws -> URL { + return try oauth.createAuthorizeURL(withCallbackURLQueryItems: queryItems) } - public func getAccessToken(request: Request) throws -> Credential { - return try self.oauth.getAccessToken(request: request) + public func getAccessToken(for request: Request) throws -> Credential { + return try self.oauth.getAccessToken(for: request) } }