2013-12-23 5 views
1

내 응용 프로그램의 일부 경로에 플라스크 로그인 @login_required 데코레이터를 사용하고 있습니다. 로그인하지 않은 상태에서 해당 경로를 탐색 할 때 로그인 페이지로 리디렉션됩니다. 여태까지는 그런대로 잘됐다.login_required 다음 매개 변수 인코딩, 리디렉션 실패

리디렉션 된 URL은 다음과 같습니다 /login?next=%2Fusers
그것이처럼, 내가 걸쳐 실행 한 예에서 볼 수없는 무언가를 다음 매개 변수를 URL 인코딩 보인다. 로그인 한 후 next으로 리다이렉트하면 항상 실패하고 색인 페이지로 돌아갑니다. next은 (는) URL로 인코딩 되었기 때문입니다.

다른 방식으로 진행해야합니까? 나는 Flask 프레임 워크로 들어가기 시작하고 예제를 사용하여 최선의 방법을 모릅니다.

여기 예를 들어 경로입니다 :

login_manager.login_view = 'login' 

@app.route('users') 
@login_required 
def users(): 
    return 'Test' 

그리고 내 로그인 경로는 다음과 같습니다 도움에 미리

@app.route('/login') 
def login(): 
    error = None 
    next = request.args.get('next') 
    if request.method == 'POST': 
    username = request.form['username'] 
    password = request.form['password'] 

    if authenticate_user(username, password): 
     user = User.query.filter_by(username=username).first() 
     if login_user(user): 
     flash("You have logged in") 
     session['logged_in'] = True 
     return redirect(next or url_for('index', error=error)) 
    error = "Login failed" 
    return render_template('login.html', login=True, next=next, error=error) 

감사합니다. 여기

+1

주 내부

2F % 2Fbadsite.com % 2F'이면 로그인 후 사용자를 외부 페이지로 리디렉션합니다. 그러면 다시 로그인하여 비밀번호를 묻습니다. 플러시, 슬프게도, 인증 및 이와 유사한 상용구 코드에 관해서는 정말 부족합니다. – Blender

+0

네, 그걸 확인하면 할 일 목록에도 있고, 지금 막 아기 단계를 진행하고 있습니다. –

+0

실제 문제는 양식 서식 파일의 작업 필드입니다. 리디렉션은 문제없이 인코딩 된 경로를 처리합니다. –

답변

3

은 내가 next 매개 변수를 사용하여 로그인 페이지로 리디렉션을 야기 로그인 보호 경로 (/이 예에서 요청)로 이동, 그것을 알아 냈다.

<form action="{{ url_for('login') }}" method='POST'> 

양식 매개 변수없이 /login 경로에 게시되는 원인 : 내 로그인 템플릿에서

/login?next=%2Frequests 

, 나는이 있었다. action 특성을 제거하거나 action=""으로 변경하면 양식이 원래 쿼리 문자열을 포함하는 자체 url에 게시됩니다. 다른 옵션은 url_for에 next=next을 포함합니다.

<form action="{{ url_for('login', next=next) }}" method='POST'> 
0

당신은 이동 :

import urllib 


@app.route('/login') 
def login(): 
    error = None 
    next = urllib.unquote_plus(request.args.get('next')) 
    ... 
+0

플라스크에서 그렇게하는 것이 좋습니까? –

+0

Flask는 세션이나 쿠키에 URL을 저장하고 매개 변수로 URL에 전달하는 등의 방식으로 구현할 수있는 유연성을 제공하기 때문에 "권장"방식을 본 적이 없습니다. 개인적으로 , 나는 세션을 사용할 것입니다. 사용자가 조작 할 가능성이 적기 때문입니다. – iandouglas

+0

URL 매개 변수는 사용자가 액세스 할 때 이미 디코딩되어 있으므로 두 번 디코딩 할 이유가 없습니다. – Blender

0

누군가 내가 이랬던 것처럼이 질문을 발견하면, 저에게 도움이되는 구현이 여기에 있습니다. 문제는 로그인의 POST 양식이/login으로 가고 있었기 때문에 다음 URL을 버리게했습니다. Kevan의 제안에 따라 로그인 폼의 동작에 next=request.args.get('next'))을 추가하면 다음 인수가 전달됩니다. ? 난 당신에게/로그인 다음 = HTTP % 3A % '와 같은 링크를 보내는 경우 : 내 로그인 기능이 보안 취약점을 노출하는

내 로그인 폼 내부
@app.route('/login', methods = ['GET', 'POST']) 
def login(): 
    next = request.args.get('next') 
    if request.method == 'POST': 
     ...Confirm User... 
      if next: 
       return redirect(next) 
      else: 
       return redirect('/') 

<form method="post" action="{{ url_for('login', next=request.args.get('next')) }}" enctype="multipart/form-data">