2017-03-03 1 views
0

私は、jsonの形式でpostgresql dbから処理されたデータを取得するために使用するAPIを作成しました。私は、Django Rest Frameworkを使用してAPIを介してユーザーを認証し、同じものの認証トークンを取得することができます。今私のアプリのいくつかのページで、私はWebアプリケーションからWebviewにページを表示する必要があります。これらのページにアクセスするには、csrfトークンが必要です。 csrfトークンは、Webアプリケーションのログインの送信ボタンで生成されます。iOS/Django:二重認証の実行方法は?

ログイン後に生成されたクッキーからcsrfトークンを抽出できます。だからここに私が達成したいと思っているものがあります。私がアプリケーションのログイン画面からログインするときは、プログラムでバックグラウンドでwebviewを作成し、ログインとパスワードを入力し、Webページのsubmitボタンをタップします。その後、クッキーからトークンを抽出します。

私がダウンしている部分の大部分は、プログラムでどのようにwebviewに記入して送信ボタンを押すかを理解することができません。 (私が送信ボタンを押す理由は、リクエストが投稿とajaxであるかどうかをビューがチェックするためです)。このようにして二重認証を実行する方法について誰かが気にしていますか?

+0

ウェブビューで必要なものにアクセスするために、アプリで使用しているのと同じトークンを使用するのはなぜですか? –

+0

api用に生成されたトークンは、webviewによって生成されたcsrfトークンおよびセッションとは異なります。 csrfトークンは、webviewがレンダリングされた後にのみブラウザによって生成されます。 – Jobs

+0

APIキーを取得し、セッションベースとしてログインするようにユーザーをログインさせたビューを作成し、必要な場所にリダイレクトします'?next =' param。 –

答えて

0

好奇心が強い人は、ログイン時に非表示のWebビューで二重認証を行うことができました。 apiの認証トークンを取得するためにapiのURLにヒットし、同時に私のwebviewでWebアプリケーションのURLをヒットしました。私は単にセッションのクッキーからCSRFトークンとセッションID取得、ユーザ名、パスワードを入力し、コードを私の要求をロードした後

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 
    } 

} 

を送信ボタンをタップして、認証に成功。

これが役に立った

関連する問題