parsing jet for google account
This commit is contained in:
parent
7905d0ff25
commit
1cbee99f12
@ -33,6 +33,7 @@
|
|||||||
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AA24360DC800E59687 /* Dated.swift */; };
|
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AA24360DC800E59687 /* Dated.swift */; };
|
||||||
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AC2436350B00E59687 /* SearchController.swift */; };
|
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AC2436350B00E59687 /* SearchController.swift */; };
|
||||||
7A3F07AF24366DF900E59687 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AE24366DF900E59687 /* Filter.swift */; };
|
7A3F07AF24366DF900E59687 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AE24366DF900E59687 /* Filter.swift */; };
|
||||||
|
7A43F9F8246C8A6200BA5B49 /* JWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A43F9F7246C8A6200BA5B49 /* JWT.swift */; };
|
||||||
7A530B78240010D900CBFE6E /* InputMask in Frameworks */ = {isa = PBXBuildFile; productRef = 7A530B77240010D900CBFE6E /* InputMask */; };
|
7A530B78240010D900CBFE6E /* InputMask in Frameworks */ = {isa = PBXBuildFile; productRef = 7A530B77240010D900CBFE6E /* InputMask */; };
|
||||||
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7924001D3300CBFE6E /* CheckController.swift */; };
|
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7924001D3300CBFE6E /* CheckController.swift */; };
|
||||||
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7D24017FEE00CBFE6E /* VehicleCell.swift */; };
|
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7D24017FEE00CBFE6E /* VehicleCell.swift */; };
|
||||||
@ -48,7 +49,6 @@
|
|||||||
7A64AE812469E16100ABE48E /* ProgressAnimatedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE7B2469E16100ABE48E /* ProgressAnimatedView.swift */; };
|
7A64AE812469E16100ABE48E /* ProgressAnimatedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE7B2469E16100ABE48E /* ProgressAnimatedView.swift */; };
|
||||||
7A64AE822469E16100ABE48E /* IHProgressHUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE7C2469E16100ABE48E /* IHProgressHUD.swift */; };
|
7A64AE822469E16100ABE48E /* IHProgressHUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE7C2469E16100ABE48E /* IHProgressHUD.swift */; };
|
||||||
7A64AE832469E16100ABE48E /* IHProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7A64AE7D2469E16100ABE48E /* IHProgressHUD.bundle */; };
|
7A64AE832469E16100ABE48E /* IHProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7A64AE7D2469E16100ABE48E /* IHProgressHUD.bundle */; };
|
||||||
7A64AE85246AD12E00ABE48E /* GoogleAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE84246AD12E00ABE48E /* GoogleAuth.swift */; };
|
|
||||||
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; };
|
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; };
|
||||||
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; };
|
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; };
|
||||||
7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
|
7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
|
||||||
@ -91,6 +91,7 @@
|
|||||||
7A3F07AA24360DC800E59687 /* Dated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dated.swift; sourceTree = "<group>"; };
|
7A3F07AA24360DC800E59687 /* Dated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dated.swift; sourceTree = "<group>"; };
|
||||||
7A3F07AC2436350B00E59687 /* SearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchController.swift; sourceTree = "<group>"; };
|
7A3F07AC2436350B00E59687 /* SearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchController.swift; sourceTree = "<group>"; };
|
||||||
7A3F07AE24366DF900E59687 /* Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = "<group>"; };
|
7A3F07AE24366DF900E59687 /* Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = "<group>"; };
|
||||||
|
7A43F9F7246C8A6200BA5B49 /* JWT.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JWT.swift; sourceTree = "<group>"; };
|
||||||
7A530B7924001D3300CBFE6E /* CheckController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckController.swift; sourceTree = "<group>"; };
|
7A530B7924001D3300CBFE6E /* CheckController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckController.swift; sourceTree = "<group>"; };
|
||||||
7A530B7D24017FEE00CBFE6E /* VehicleCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleCell.swift; sourceTree = "<group>"; };
|
7A530B7D24017FEE00CBFE6E /* VehicleCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleCell.swift; sourceTree = "<group>"; };
|
||||||
7A530B7F2401803A00CBFE6E /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; };
|
7A530B7F2401803A00CBFE6E /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; };
|
||||||
@ -105,7 +106,6 @@
|
|||||||
7A64AE7B2469E16100ABE48E /* ProgressAnimatedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressAnimatedView.swift; sourceTree = "<group>"; };
|
7A64AE7B2469E16100ABE48E /* ProgressAnimatedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressAnimatedView.swift; sourceTree = "<group>"; };
|
||||||
7A64AE7C2469E16100ABE48E /* IHProgressHUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IHProgressHUD.swift; sourceTree = "<group>"; };
|
7A64AE7C2469E16100ABE48E /* IHProgressHUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IHProgressHUD.swift; sourceTree = "<group>"; };
|
||||||
7A64AE7D2469E16100ABE48E /* IHProgressHUD.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = IHProgressHUD.bundle; sourceTree = "<group>"; };
|
7A64AE7D2469E16100ABE48E /* IHProgressHUD.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = IHProgressHUD.bundle; sourceTree = "<group>"; };
|
||||||
7A64AE84246AD12E00ABE48E /* GoogleAuth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuth.swift; sourceTree = "<group>"; };
|
|
||||||
7A6DD902242BF4A5009DE740 /* PlateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateView.swift; sourceTree = "<group>"; };
|
7A6DD902242BF4A5009DE740 /* PlateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateView.swift; sourceTree = "<group>"; };
|
||||||
7A6DD90724329144009DE740 /* CenterTextLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTextLayer.swift; sourceTree = "<group>"; };
|
7A6DD90724329144009DE740 /* CenterTextLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTextLayer.swift; sourceTree = "<group>"; };
|
||||||
7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers2.0.otf; sourceTree = "<group>"; };
|
7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers2.0.otf; sourceTree = "<group>"; };
|
||||||
@ -213,6 +213,7 @@
|
|||||||
7A64AE6E2469DFB600ABE48E /* ATGMediaBrowser */,
|
7A64AE6E2469DFB600ABE48E /* ATGMediaBrowser */,
|
||||||
7A6DD90724329144009DE740 /* CenterTextLayer.swift */,
|
7A6DD90724329144009DE740 /* CenterTextLayer.swift */,
|
||||||
7A96AE32246C095700297C33 /* Base64FS.swift */,
|
7A96AE32246C095700297C33 /* Base64FS.swift */,
|
||||||
|
7A11474323FF06CA00B424AF /* Api.swift */,
|
||||||
);
|
);
|
||||||
path = ThirdParty;
|
path = ThirdParty;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -220,9 +221,8 @@
|
|||||||
7A11474223FF06B600B424AF /* Utils */ = {
|
7A11474223FF06B600B424AF /* Utils */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
7A11474323FF06CA00B424AF /* Api.swift */,
|
|
||||||
7A64AE84246AD12E00ABE48E /* GoogleAuth.swift */,
|
|
||||||
7A96AE30246B2FE400297C33 /* Constants.swift */,
|
7A96AE30246B2FE400297C33 /* Constants.swift */,
|
||||||
|
7A43F9F7246C8A6200BA5B49 /* JWT.swift */,
|
||||||
);
|
);
|
||||||
path = Utils;
|
path = Utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -435,7 +435,6 @@
|
|||||||
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */,
|
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */,
|
||||||
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */,
|
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */,
|
||||||
7A64AE7E2469E16100ABE48E /* RadialGradientLayer.swift in Sources */,
|
7A64AE7E2469E16100ABE48E /* RadialGradientLayer.swift in Sources */,
|
||||||
7A64AE85246AD12E00ABE48E /* GoogleAuth.swift in Sources */,
|
|
||||||
7A64AE7F2469E16100ABE48E /* IndefiniteAnimatedView.swift in Sources */,
|
7A64AE7F2469E16100ABE48E /* IndefiniteAnimatedView.swift in Sources */,
|
||||||
7A11471A23FE839000B424AF /* AuthController.swift in Sources */,
|
7A11471A23FE839000B424AF /* AuthController.swift in Sources */,
|
||||||
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */,
|
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */,
|
||||||
@ -446,6 +445,7 @@
|
|||||||
7A11474723FF2AA500B424AF /* User.swift in Sources */,
|
7A11474723FF2AA500B424AF /* User.swift in Sources */,
|
||||||
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */,
|
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */,
|
||||||
7AF58D3124029E1000CE01A0 /* VehicleHeaderCell.swift in Sources */,
|
7AF58D3124029E1000CE01A0 /* VehicleHeaderCell.swift in Sources */,
|
||||||
|
7A43F9F8246C8A6200BA5B49 /* JWT.swift in Sources */,
|
||||||
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
|
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
|
||||||
7A11470323FDE7E500B424AF /* SceneDelegate.swift in Sources */,
|
7A11470323FDE7E500B424AF /* SceneDelegate.swift in Sources */,
|
||||||
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */,
|
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */,
|
||||||
|
|||||||
@ -33,8 +33,8 @@
|
|||||||
"repositoryURL": "https://github.com/onevcat/Kingfisher",
|
"repositoryURL": "https://github.com/onevcat/Kingfisher",
|
||||||
"state": {
|
"state": {
|
||||||
"branch": null,
|
"branch": null,
|
||||||
"revision": "349ed06467a6f8a4939bcb83db301542bc84eac9",
|
"revision": "910d808ade2a576e1a292ceb458a6fa43f67f594",
|
||||||
"version": "5.13.4"
|
"version": "5.14.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -24,69 +24,5 @@
|
|||||||
stopOnStyle = "0">
|
stopOnStyle = "0">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
<BreakpointProxy
|
|
||||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
||||||
<BreakpointContent
|
|
||||||
uuid = "2445735D-04AB-4C39-A7D2-AED33C44BBB5"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
filePath = "AutoCat/Controllers/GoogleSignInController.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "86"
|
|
||||||
endingLineNumber = "86"
|
|
||||||
landmarkName = "getToken(code:completion:)"
|
|
||||||
landmarkType = "7">
|
|
||||||
</BreakpointContent>
|
|
||||||
</BreakpointProxy>
|
|
||||||
<BreakpointProxy
|
|
||||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
||||||
<BreakpointContent
|
|
||||||
uuid = "A5665C58-1F74-4052-A342-38ACB119101F"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
filePath = "AutoCat/Controllers/GoogleSignInController.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "94"
|
|
||||||
endingLineNumber = "94"
|
|
||||||
landmarkName = "getToken(code:completion:)"
|
|
||||||
landmarkType = "7">
|
|
||||||
</BreakpointContent>
|
|
||||||
</BreakpointProxy>
|
|
||||||
<BreakpointProxy
|
|
||||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
||||||
<BreakpointContent
|
|
||||||
uuid = "20DDDF73-CE71-4674-9A6D-8D288D551536"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
filePath = "AutoCat/Controllers/GoogleSignInController.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "90"
|
|
||||||
endingLineNumber = "90"
|
|
||||||
landmarkName = "getToken(code:completion:)"
|
|
||||||
landmarkType = "7">
|
|
||||||
</BreakpointContent>
|
|
||||||
</BreakpointProxy>
|
|
||||||
<BreakpointProxy
|
|
||||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
||||||
<BreakpointContent
|
|
||||||
uuid = "68C7E1F5-1364-46D7-BE9D-09793D4882B9"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
filePath = "AutoCat/Controllers/GoogleSignInController.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "81"
|
|
||||||
endingLineNumber = "81"
|
|
||||||
landmarkName = "getToken(code:completion:)"
|
|
||||||
landmarkType = "7">
|
|
||||||
</BreakpointContent>
|
|
||||||
</BreakpointProxy>
|
|
||||||
</Breakpoints>
|
</Breakpoints>
|
||||||
</Bucket>
|
</Bucket>
|
||||||
|
|||||||
@ -2,6 +2,15 @@ import UIKit
|
|||||||
import WebKit
|
import WebKit
|
||||||
import CommonCrypto
|
import CommonCrypto
|
||||||
|
|
||||||
|
private struct TokenResponse: Codable {
|
||||||
|
var id_token: String
|
||||||
|
var refresh_token: String
|
||||||
|
var access_token: String
|
||||||
|
var expires_in: Int
|
||||||
|
var token_type: String
|
||||||
|
var scope: String
|
||||||
|
}
|
||||||
|
|
||||||
class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
||||||
@IBOutlet weak var webView: WKWebView!
|
@IBOutlet weak var webView: WKWebView!
|
||||||
|
|
||||||
@ -19,9 +28,6 @@ class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
|||||||
|
|
||||||
self.codeVerifier = UUID().uuidString
|
self.codeVerifier = UUID().uuidString
|
||||||
let codeChallenge = self.sha256(string: self.codeVerifier) ?? ""
|
let codeChallenge = self.sha256(string: self.codeVerifier) ?? ""
|
||||||
print("++++++++++++++++++")
|
|
||||||
print(codeVerifier)
|
|
||||||
print(codeChallenge)
|
|
||||||
|
|
||||||
let authUrlString = Constants.googleAuthURL
|
let authUrlString = Constants.googleAuthURL
|
||||||
+ "?response_type=code"
|
+ "?response_type=code"
|
||||||
@ -43,8 +49,20 @@ class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
|||||||
if let queryItems = components.queryItems {
|
if let queryItems = components.queryItems {
|
||||||
if let code = queryItems.first(where: { $0.name == "code" })?.value {
|
if let code = queryItems.first(where: { $0.name == "code" })?.value {
|
||||||
decisionHandler(.cancel)
|
decisionHandler(.cancel)
|
||||||
self.getToken(code: code) { error, idToken in
|
self.getToken(code: code) { error, idToken, refreshToken in
|
||||||
print("ID Token: \(idToken)")
|
if let err = error {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.dismiss(animated: true) {
|
||||||
|
IHProgressHUD.showError(withStatus: err.localizedDescription)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Settings.shared.user.googleIdToken = idToken
|
||||||
|
Settings.shared.user.googleRefreshToken = refreshToken
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.dismiss(animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -70,7 +88,7 @@ class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
|||||||
return String(data: Data(Base64FS.encode(data: hash)), encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "="))
|
return String(data: Data(Base64FS.encode(data: hash)), encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "="))
|
||||||
}
|
}
|
||||||
|
|
||||||
func getToken(code: String, completion: @escaping (Error?, String?) -> Void) {
|
func getToken(code: String, completion: @escaping (Error?, String?, String?) -> Void) {
|
||||||
let tokenUrlString = Constants.googleTokenURL
|
let tokenUrlString = Constants.googleTokenURL
|
||||||
+ "?grant_type=authorization_code"
|
+ "?grant_type=authorization_code"
|
||||||
+ "&code=" + code
|
+ "&code=" + code
|
||||||
@ -81,18 +99,22 @@ class GoogleSignInController: UIViewController, WKNavigationDelegate {
|
|||||||
if let url = URL(string: tokenUrlString) {
|
if let url = URL(string: tokenUrlString) {
|
||||||
var request = URLRequest(url: url)
|
var request = URLRequest(url: url)
|
||||||
request.httpMethod = "POST"
|
request.httpMethod = "POST"
|
||||||
URLSession.shared.dataTask(with: request) { data, response, error in
|
let task = URLSession.shared.dataTask(with: request) { data, response, error in
|
||||||
if let data = data {
|
if let data = data {
|
||||||
if let str = String(data: data, encoding: .utf8) {
|
if let resp = try? JSONDecoder().decode(TokenResponse.self, from: data) {
|
||||||
print(str)
|
completion(nil, resp.id_token, resp.refresh_token)
|
||||||
|
} else {
|
||||||
|
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Response parsing error"])
|
||||||
|
completion(error, nil, nil)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
completion(error, nil)
|
completion(error, nil, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
task.resume()
|
||||||
} else {
|
} else {
|
||||||
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Bad URL"])
|
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Bad URL"])
|
||||||
completion(error, nil)
|
completion(error, nil, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,8 +12,12 @@ class SettingsController: FormViewController {
|
|||||||
row.value = Settings.shared.user.login
|
row.value = Settings.shared.user.login
|
||||||
}
|
}
|
||||||
<<< LabelRow("GoogleAccount") { row in
|
<<< LabelRow("GoogleAccount") { row in
|
||||||
row.title = "Google Account"
|
row.title = "Google"
|
||||||
|
if let jwtString = Settings.shared.user.googleIdToken, let jwt = JWT(string: jwtString) {
|
||||||
|
row.value = jwt.payload.email
|
||||||
|
} else {
|
||||||
row.value = "Log In"
|
row.value = "Log In"
|
||||||
|
}
|
||||||
row.cellUpdate { cell, _ in
|
row.cellUpdate { cell, _ in
|
||||||
cell.accessoryType = .disclosureIndicator
|
cell.accessoryType = .disclosureIndicator
|
||||||
}
|
}
|
||||||
@ -37,7 +41,9 @@ class SettingsController: FormViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func displayLogoutSheet() {
|
func displayLogoutSheet() {
|
||||||
let sheet = UIAlertController(title: "Google Account", message: "You are currently signed in with email example@gmail.com. It allows us to find more data about vehicles.", preferredStyle: .actionSheet)
|
guard let jwtString = Settings.shared.user.googleIdToken, let jwt = JWT(string: jwtString) else { return }
|
||||||
|
|
||||||
|
let sheet = UIAlertController(title: jwt.payload.name, message: "You are currently signed in with email \(jwt.payload.email). It allows us to find more data about vehicles.", preferredStyle: .actionSheet)
|
||||||
|
|
||||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in sheet.dismiss(animated: true, completion: nil) }
|
let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in sheet.dismiss(animated: true, completion: nil) }
|
||||||
let logout = UIAlertAction(title: "Sign Out", style: .destructive) { _ in
|
let logout = UIAlertAction(title: "Sign Out", style: .destructive) { _ in
|
||||||
|
|||||||
@ -4,10 +4,10 @@ struct User: Codable {
|
|||||||
let login: String
|
let login: String
|
||||||
var token: String
|
var token: String
|
||||||
var googleIdToken: String?
|
var googleIdToken: String?
|
||||||
|
var googleRefreshToken: String?
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
self.login = ""
|
self.login = ""
|
||||||
self.token = ""
|
self.token = ""
|
||||||
self.googleIdToken = ""
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,2 +0,0 @@
|
|||||||
import Foundation
|
|
||||||
|
|
||||||
38
AutoCat/Utils/JWT.swift
Normal file
38
AutoCat/Utils/JWT.swift
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct JwtPayload: Codable {
|
||||||
|
var email: String
|
||||||
|
var name: String
|
||||||
|
var exp: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
class JWT {
|
||||||
|
private var jwt: String
|
||||||
|
public let payload: JwtPayload
|
||||||
|
public var expired: Bool {
|
||||||
|
return TimeInterval(self.payload.exp) < Date().timeIntervalSince1970
|
||||||
|
}
|
||||||
|
|
||||||
|
init?(string: String) {
|
||||||
|
self.jwt = string
|
||||||
|
|
||||||
|
let parts = string.split(separator: ".")
|
||||||
|
if parts.count == 3 {
|
||||||
|
var payloadStr = String(parts[1])
|
||||||
|
if (payloadStr.count % 2 != 0) {
|
||||||
|
payloadStr += String(repeating: "=", count: (payloadStr.count % 2))
|
||||||
|
}
|
||||||
|
if let json = Data(base64Encoded: payloadStr, options: [.ignoreUnknownCharacters]) {
|
||||||
|
if let resp = try? JSONDecoder().decode(JwtPayload.self, from: json) {
|
||||||
|
self.payload = resp
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user