0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flask ログイン / セッション / passwaセキュ / token

Posted at

Flask ログイン / セッション / passwaセキュ / token

Flask ログイン機能でユーザー名のみ 認証FlaskログインとFlaskバリデーションをいれないで名前正しいかだけチェック
from flask import Flask, request, redirect, url_for, render_template_string, session

app = Flask(__name__)
app.secret_key = 'secret'

VALID_USERNAMES = ['alice', 'bob', 'carol']

login_form = '''
<form method="post">
  ユーザー名: <input name="username">
  <input type="submit" value="ログイン">
</form>
'''

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username', '').lower()
        if username in VALID_USERNAMES:
            session['username'] = username
            return f"ログイン成功: {username}"
        else:
            return "ユーザー名が正しくありません", 401
    return render_template_string(login_form)

if __name__ == '__main__':
    app.run(debug=True)


from werkzeug.security import generate_password_hash, check_password_hash

password = 'mypassword'
hashed_pw = generate_password_hash(password)
print("ハッシュ:", hashed_pw)

check = check_password_hash(hashed_pw, 'mypassword')
print("正しいパスワード?", check)



トークン認証PyJWT
import jwt
import datetime

SECRET_KEY = 'mysecret'

# トークン作成
payload = {
    'user': 'alice',
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
print("JWTトークン:", token)

# トークン検証
try:
    data = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
    print("認証成功:", data)
except jwt.ExpiredSignatureError:
    print("トークン期限切れ")
except jwt.InvalidTokenError:
    print("無効トークン")


セッション管理 "ブラウザごとのデータ保存・取得・削除"
from flask import Flask, session, redirect, url_for

app = Flask(__name__)
app.secret_key = 'secret'

@app.route('/set/')
def set_session():
    session['data'] = 'セッションデータ'
    return "セッションに保存しました"

@app.route('/get/')
def get_session():
    data = session.get('data', 'なし')
    return f"セッションのデータ: {data}"

@app.route('/clear/')
def clear_session():
    session.clear()
    return "セッションをクリアしました"

if __name__ == '__main__':
    app.run(debug=True)

htmlset ver ログイン / パスワードのハッシュ化 / トークン認証(pyJWT)/セッション管理

Flask ログイン機能(ライブラリなし)
# app_login.py
from flask import Flask, request, render_template_string, session

app = Flask(__name__)
app.secret_key = 'secret'

VALID_USERS = ['alice', 'bob', 'carol']

login_html = '''
<form method="post">
  ユーザー名: <input type="text" name="username" required>
  <input type="submit" value="ログイン">
</form>
'''

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        name = request.form['username'].lower()
        if name in VALID_USERS:
            session['username'] = name
            return f'ログイン成功: {name}'
        else:
            return 'ユーザー名が正しくありません', 401
    return render_template_string(login_html)

if __name__ == '__main__':
    app.run(debug=True)



トークン認証pyJWT
# app_jwt.py
from flask import Flask, request, render_template_string
import jwt
import datetime

app = Flask(__name__)
SECRET = 'secretkey'

form_html = '''
<form method="post">
  ユーザー名: <input name="username" required>
  <input type="submit" value="トークン発行">
</form>
'''

token_check_html = '''
<form method="post">
  トークン: <input name="token" required style="width:400px;">
  <input type="submit" value="トークン検証">
</form>
'''

@app.route('/token', methods=['GET', 'POST'])
def get_token():
    if request.method == 'POST':
        user = request.form['username']
        payload = {
            'user': user,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
        }
        token = jwt.encode(payload, SECRET, algorithm='HS256')
        return f"トークン発行成功:<br><textarea rows='3' cols='70'>{token}</textarea>"
    return render_template_string(form_html)

@app.route('/verify', methods=['GET', 'POST'])
def verify_token():
    if request.method == 'POST':
        token = request.form['token']
        try:
            data = jwt.decode(token, SECRET, algorithms=['HS256'])
            return f"認証成功!ユーザー: {data['user']}"
        except jwt.ExpiredSignatureError:
            return "トークン期限切れ"
        except jwt.InvalidTokenError:
            return "無効なトークン"
    return render_template_string(token_check_html)

if __name__ == '__main__':
    app.run(debug=True)


セッション管理
# app_session.py
from flask import Flask, session, request, redirect, url_for, render_template_string

app = Flask(__name__)
app.secret_key = 'secret'

html = '''
<form method="post" action="/set">
  セッションに保存する値: <input name="value" required>
  <input type="submit" value="保存">
</form>
<form method="get" action="/get">
  <input type="submit" value="取得">
</form>
<form method="get" action="/clear">
  <input type="submit" value="クリア">
</form>
'''

@app.route('/')
def index():
    return render_template_string(html)

@app.route('/set', methods=['POST'])
def set_value():
    val = request.form['value']
    session['mydata'] = val
    return f"セッションに保存しました: {val} <br><a href='/'>戻る</a>"

@app.route('/get')
def get_value():
    val = session.get('mydata', 'なし')
    return f"セッションの値: {val} <br><a href='/'>戻る</a>"

@app.route('/clear')
def clear():
    session.clear()
    return "セッションをクリアしました <br><a href='/'>戻る</a>"

if __name__ == '__main__':
    app.run(debug=True)

html別々ver

ユーザー名のみログイン認証

from flask import Flask, request, session, redirect, url_for, render_template

app = Flask(__name__)
app.secret_key = 'secret'

VALID_USERS = ['alice', 'bob', 'carol']

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username'].lower()
        if username in VALID_USERS:
            session['username'] = username
            return f"ログイン成功: {username}"
        else:
            return "ユーザー名が正しくありません", 401
    return render_template('login.html')

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>ログイン</title></head>
<body>
<form method="post" action="/login">
  ユーザー名: <input type="text" name="username" required>
  <input type="submit" value="ログイン">
</form>
</body>
</html>

JWTトークン認証

from flask import Flask, request, render_template
import jwt
import datetime

app = Flask(__name__)
SECRET_KEY = 'secretkey'

@app.route('/token', methods=['GET', 'POST'])
def token():
    if request.method == 'POST':
        user = request.form['username']
        payload = {'user': user, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5)}
        token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
        return f"<p>トークン:<br><textarea rows='4' cols='50'>{token}</textarea></p>"
    return render_template('token_form.html')

@app.route('/verify', methods=['GET', 'POST'])
def verify():
    if request.method == 'POST':
        token = request.form['token']
        try:
            data = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
            return f"認証成功!ユーザー: {data['user']}"
        except jwt.ExpiredSignatureError:
            return "トークン期限切れ"
        except jwt.InvalidTokenError:
            return "無効なトークン"
    return render_template('verify_form.html')

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>トークン発行</title></head>
<body>
<form method="post" action="/token">
  ユーザー名: <input name="username" required>
  <input type="submit" value="トークン発行">
</form>
</body>
</html>

セッション データブラウザごとに保存

from flask import Flask, session, request, redirect, url_for, render_template

app = Flask(__name__)
app.secret_key = 'secret'

@app.route('/')
def index():
    return render_template('session.html')

@app.route('/set', methods=['POST'])
def set_session():
    val = request.form['value']
    session['mydata'] = val
    return redirect(url_for('index'))

@app.route('/get')
def get_session():
    val = session.get('mydata', 'なし')
    return f"セッションの値: {val} <br><a href='/'>戻る</a>"

@app.route('/clear')
def clear_session():
    session.clear()
    return "セッションをクリアしました <br><a href='/'>戻る</a>"

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>セッション管理</title></head>
<body>
<form method="post" action="/set">
  セッションに保存する値: <input name="value" required>
  <input type="submit" value="保存">
</form>
<form method="get" action="/get">
  <input type="submit" value="取得">
</form>
<form method="get" action="/clear">
  <input type="submit" value="クリア">
</form>
</body>
</html>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?