@@ -37,7 +37,7 @@ class DiningLoginController: UIViewController, WKUIDelegate, WKNavigationDelegat
3737 var url = URL ( string: urlStr) !
3838 url. appendQueryItem ( name: " response_type " , value: " code " )
3939 url. appendQueryItem ( name: " client_id " , value: clientId)
40- url. appendQueryItem ( name: " state " , value: " abc " )
40+ url. appendQueryItem ( name: " state " , value: stateString )
4141 url. appendQueryItem ( name: " scope " , value: " read " )
4242 url. appendQueryItem ( name: " code_challenge " , value: codeChallenge)
4343 url. appendQueryItem ( name: " code_challenge_method " , value: " S256 " )
@@ -54,6 +54,8 @@ class DiningLoginController: UIViewController, WKUIDelegate, WKNavigationDelegat
5454
5555 private let codeVerifier = String . randomString ( length: 64 )
5656
57+ private let state = String . randomString ( length: 64 )
58+
5759 private var codeChallenge : String {
5860 var challenge = hash ( string: codeVerifier, encoding: . base64)
5961 challenge. removeAll ( where: { $0 == " = " } )
@@ -62,11 +64,19 @@ class DiningLoginController: UIViewController, WKUIDelegate, WKNavigationDelegat
6264 return challenge
6365 }
6466
67+ private var stateString : String {
68+ var state = state
69+ state. removeAll ( where: { $0 == " = " } )
70+ state = state. replacingOccurrences ( of: " + " , with: " - " )
71+ state = state. replacingOccurrences ( of: " / " , with: " _ " )
72+ return state
73+ }
74+
6575 func webView( _ webView: WKWebView , decidePolicyFor navigationResponse: WKNavigationResponse , decisionHandler: @escaping ( WKNavigationResponsePolicy ) -> Void ) {
6676 if let url = navigationResponse. response. url, url. absoluteString. contains ( " https://pennlabs.org/pennmobile/ios/campus_express_callback/ " ) {
6777 let queryParams = url. queryParameters
6878
69- guard queryParams [ " state " ] == " abc " else { print ( " ERROR " ) ; return }
79+ guard queryParams [ " state " ] == stateString else { return }
7080
7181 if let code = queryParams [ " code " ] {
7282 var url = URL ( string: " https://prod.campusexpress.upenn.edu/api/v1/oauth/token " ) !
0 commit comments