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>