2017-03-03 49 views
0

我已經創建了一個API,用於以json的形式從postgresql數據庫獲取已處理的數據。我可以通過使用Django Rest Framework的API來驗證用戶身份,並獲得相同的身份驗證令牌。現在在我的應用程序的一些頁面中,我需要從Web應用程序的webview中顯示頁面。這些頁面需要一個csrf令牌才能被訪問。 csrf令牌在Web應用程序的登錄提交按鈕上生成。iOS/Django:如何執行雙重身份驗證?

我可以從登錄後生成的cookie中提取csrf標記。所以這是我希望能夠實現的。每當我從我的應用程序登錄屏幕登錄,我想以編程方式在後臺創建一個webview,填寫登錄名和密碼,然後點擊網頁中的提交按鈕。然後,我將繼續從Cookie中提取令牌。

大部分我已經失望的部分,我無法弄清楚如何以編程方式填寫webview並點擊提交按鈕。 (我想點擊提交按鈕的原因是因爲視圖檢查請求是否是帖子和ajax)。任何人都可以闡明我如何以這種方式執行雙重身份驗證?

+0

爲什麼你不想只使用你在應用程序中使用的相同標記來訪問Web視圖中所需的任何東西? –

+0

爲api生成的令牌與由webview生成的csrf令牌和會話不同。一旦webview被呈現,csrf令牌將僅由瀏覽器生成 – Jobs

+0

您可以創建一個視圖,在其中獲取API密鑰並以基於會話的身份登錄用戶以便登錄,然後重定向到您需要的任何位置,無論您設置什麼在'?next ='參數中。 –

回答

0

如果有人很好奇,我設法在登錄時通過隱藏的web視圖執行雙重身份驗證。我點擊了api網址以獲取api身份驗證令牌,同時在我的webview上點擊了網絡應用的網址。我填寫用戶名,密碼,並通過代碼挖掘提交按鈕

func webViewDidFinishLoad(_ webView: UIWebView) { 
    print("loadFinished") 
    let loadUsername = "var emailText = document.getElementById('email'); emailText.value = '\(username)';" 
    let loadPass = "var passText = document.getElementById('password'); passText.value = '\(pass)';" 
    let submitAction = "var passFields = document.getElementById('login_button'); passFields.click();" 

    webView.stringByEvaluatingJavaScript(from: loadUsername) 
    webView.stringByEvaluatingJavaScript(from: loadPass) 
    webView.stringByEvaluatingJavaScript(from: submitAction) 
    print("Executed!") 

    let req = URLRequest(url: URL(string: "https://app.xyz.io/abc/")!) 
    if tf != true { 
     webView.loadRequest(req) 
     tf = true 
    } 

} 

我的要求加載後,併成功認證,我只是檢索CSRF令牌和會話ID從會話的Cookie。

希望這有助於某人!