Skip to content

Instantly share code, notes, and snippets.

@justMaku
Last active December 14, 2016 20:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justMaku/13c5df4d35c3be08f44e70d9da28e76c to your computer and use it in GitHub Desktop.
Save justMaku/13c5df4d35c3be08f44e70d9da28e76c to your computer and use it in GitHub Desktop.
import RxSwift
import Heimdallr
class Authenticator {
static let tokenURL = NSURL(string: "http://localhost:3000/oauth/token")
let oauthProvider: Heimdallr
init() {
let credentials = OAuthClientCredentials(id: "", secret: "")
self.oauthProvider = Heimdallr(tokenURL: Authenticator.tokenURL, credentials: credentials)
}
func signRequest(request: NSURLRequest) -> Observable<NSURLRequest> {
return Observable.create {
observer in
self.oauthProvider.authenticateRequest(request) {
result in
switch result {
case .Success(let signedRequest):
observer.onNext(signedRequest)
case .Failure(let error):
observer.onError(error)
}
observer.onCompleted()
}
return NopDisposable.instance
}
}
}
import Moya
public enum Endpoint {
case Me
}
extension Endpoint: TargetType {
public var baseURL: NSURL { return NSURL(string: "http://localhost:3000/api/v1")! }
public var path: String {
switch self {
case .Me:
return "/user/me"
}
}
public var method: RxMoya.Method {
return .GET
}
public var parameters: [String: AnyObject]? {
return nil
}
public var sampleData: NSData {
return NSData()
}
}
extension Endpoint {
var requiresAuthentication: Bool {
switch self {
case .Me:
return true
}
}
}
extension Endpoint {
var requiresAuthentication: Bool {
switch self {
case .Me:
return true
}
}
}
import RxSwift
import RxMoya
enum APIProviderError: ErrorType {
case NoToken
}
class Provider: RxMoyaProvider<Endpoint> {
typealias Target = Endpoint
let authenticator: Authenticator
let disposeBag: DisposeBag
init() {
let authProvider = Authenticator()
let bag = DisposeBag()
let signRequest = {
(endpoint: RxMoya.Endpoint<Target>, done: (NSURLRequest -> Void)) in
authProvider
.signRequest(endpoint.urlRequest).subscribeNext {
done($0)
}
.addDisposableTo(bag)
}
self.disposeBag = bag
self.authenticator = authProvider
super.init(requestClosure: signRequest)
}
override func request(token: Target) -> Observable<Response> {
if token.requiresAuthentication {
if !self.authenticator.oauthProvider.hasAccessToken {
return Observable<Response>.error(APIProviderError.NoToken)
}
}
return super.request(token)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment