2014-05-04 18 views
1

我试图在Flask中实现登录/注册视图,该视图支持常规登录(通过Flask-Security)和OAuth登录(通过Flask-Social)。启用CSRF的网站上的Flask-Social

我的网站使用CSRF保护,但是当我实现一个到OAuth登录页面的链接时(根据Flask-Social example project),我得到一个CSRF错误。这里是模板:

{% extends "base.html" %} 
{% from "security/_macros.html" import render_field_with_errors, render_field %} 
{% block title %}Login{% endblock %} 
{% block body %} 
    <h1>Login</h1> 
    {% include "security/_messages.html" %} 
    <form action="{{ url_for_security('login') }}" method="POST" 
     name="login_user_form"> 
     {{ login_user_form.hidden_tag() }} 
     {{ render_field_with_errors(login_user_form.email, 
      class="form-control", placeholder="Your email") }} 
     {{ render_field_with_errors(login_user_form.password, 
      class="form-control", placeholder="Password") }} 
     {{ render_field(login_user_form.remember) }} 
     {{ render_field(login_user_form.next) }} 
     {{ render_field(login_user_form.submit, class="btn btn-primary") }} 
    </form> 
    <form action="{{ url_for('social.login', provider_id='google') }}" 
     name='google_login_form' method="POST"> 
     <input class="btn btn-primary btn-large" type="submit" 
      name="login_google" value="Login with Google" > 
    </form> 
    {% include "security/_menu.html" %} 
{% endblock %} 

这个问题似乎是第二form没有CSRF场;我能做些什么呢?

回答

0

您应该遵循Flask-WTF关于使用没有窗体的模板的文档。

按照该文档,在应用

from flask_wtf.csrf import CsrfProtect 

CsrfProtect(app) 

,并在模板

<form method="post" action="/"> 
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> 
</form> 

你的第二个形式是

<form action="{{ url_for('social.login', provider_id='google') }}" 
    name='google_login_form' method="POST"> 
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> 
    <input class="btn btn-primary btn-large" type="submit" 
     name="login_google" value="Login with Google" > 
</form> 
相关问题