home & auth blueprints
This commit is contained in:
parent
11be74c2ad
commit
3c095fe08a
1
app.py
1
app.py
@ -57,7 +57,6 @@ def test_data():
|
|||||||
print('test url: http://127.0.0.1:5000/oauth/authorize?scope=profile&response_type=code&client_id={}'.format(client_id))
|
print('test url: http://127.0.0.1:5000/oauth/authorize?scope=profile&response_type=code&client_id={}'.format(client_id))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
manager.run()
|
manager.run()
|
||||||
|
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_migrate import Migrate
|
from flask_migrate import Migrate
|
||||||
from flask_login import LoginManager
|
from flask_login import LoginManager
|
||||||
from flask_sqlalchemy import SQLAlchemy
|
|
||||||
from .routes import bp
|
|
||||||
from .models import db, User
|
from .models import db, User
|
||||||
from .oauth2 import config_oauth
|
from .auth.oauth2 import config_oauth
|
||||||
import config
|
|
||||||
|
|
||||||
migrate = Migrate()
|
migrate = Migrate()
|
||||||
login_manager = LoginManager()
|
login_manager = LoginManager()
|
||||||
login_manager.login_view = 'home.login'
|
login_manager.login_view = 'auth.login'
|
||||||
|
|
||||||
|
|
||||||
def create_app(cfg):
|
def create_app(cfg):
|
||||||
@ -24,7 +21,10 @@ def setup_app(app):
|
|||||||
config_oauth(app)
|
config_oauth(app)
|
||||||
migrate.init_app(app, db)
|
migrate.init_app(app, db)
|
||||||
login_manager.init_app(app)
|
login_manager.init_app(app)
|
||||||
app.register_blueprint(bp, url_prefix='')
|
from .auth import auth
|
||||||
|
from .home import home
|
||||||
|
app.register_blueprint(auth, url_prefix='')
|
||||||
|
app.register_blueprint(home, url_prefix='')
|
||||||
|
|
||||||
|
|
||||||
@login_manager.user_loader
|
@login_manager.user_loader
|
||||||
|
4
website/auth/__init__.py
Normal file
4
website/auth/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from flask import Blueprint
|
||||||
|
|
||||||
|
auth = Blueprint('auth', __name__, template_folder='templates')
|
||||||
|
from . import routes
|
@ -11,8 +11,8 @@ from authlib.integrations.sqla_oauth2 import (
|
|||||||
from authlib.oauth2.rfc6749 import grants
|
from authlib.oauth2.rfc6749 import grants
|
||||||
from authlib.oauth2.rfc7636 import CodeChallenge
|
from authlib.oauth2.rfc7636 import CodeChallenge
|
||||||
from werkzeug.security import gen_salt
|
from werkzeug.security import gen_salt
|
||||||
from .models import db, User
|
from ..models import db, User
|
||||||
from .models import OAuth2Client, OAuth2AuthorizationCode, OAuth2Token
|
from ..models import OAuth2Client, OAuth2AuthorizationCode, OAuth2Token
|
||||||
|
|
||||||
|
|
||||||
class AuthorizationCodeGrant(grants.AuthorizationCodeGrant):
|
class AuthorizationCodeGrant(grants.AuthorizationCodeGrant):
|
@ -1,62 +1,48 @@
|
|||||||
from flask import Blueprint, Flask, request, render_template, redirect, url_for, flash, jsonify, make_response, session
|
from . import auth
|
||||||
|
from flask import request, render_template, redirect, url_for, flash, jsonify
|
||||||
from flask_login import login_required, login_user, current_user, logout_user
|
from flask_login import login_required, login_user, current_user, logout_user
|
||||||
from authlib.integrations.flask_oauth2 import current_token
|
from authlib.integrations.flask_oauth2 import current_token
|
||||||
from authlib.oauth2 import OAuth2Error
|
from authlib.oauth2 import OAuth2Error
|
||||||
from .models import User, OAuth2Client, db
|
from ..models import User, db
|
||||||
from .forms import LoginForm, ConfirmAccessForm
|
|
||||||
from .oauth2 import authorization, require_oauth
|
from .oauth2 import authorization, require_oauth
|
||||||
from werkzeug.exceptions import abort
|
from .forms import LoginForm, ConfirmAccessForm
|
||||||
|
|
||||||
bp = Blueprint('home', __name__)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/')
|
@auth.route('/login/', methods=['post', 'get'])
|
||||||
def home():
|
|
||||||
user = None
|
|
||||||
if current_user.is_authenticated:
|
|
||||||
clients = current_user.clients
|
|
||||||
user = current_user.name
|
|
||||||
else:
|
|
||||||
clients = []
|
|
||||||
|
|
||||||
return render_template('home.html', user=user, clients=clients)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/login/', methods=['post', 'get'])
|
|
||||||
def login():
|
def login():
|
||||||
if current_user.is_authenticated:
|
if current_user.is_authenticated:
|
||||||
return redirect(url_for('.home'))
|
return redirect(url_for('home.index'))
|
||||||
form = LoginForm()
|
form = LoginForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
user = db.session.query(User).filter(User.username == form.username.data).first()
|
user = db.session.query(User).filter(User.username == form.username.data).first()
|
||||||
if user and user.check_password(form.password.data):
|
if user and user.check_password(form.password.data):
|
||||||
login_user(user, remember=form.remember.data)
|
login_user(user, remember=form.remember.data)
|
||||||
nextpage = request.args.get('next', url_for('.home'))
|
nextpage = request.args.get('next', url_for('home.index'))
|
||||||
return redirect(nextpage)
|
return redirect(nextpage)
|
||||||
else:
|
else:
|
||||||
flash("Invalid username/password", 'error')
|
flash("Invalid username/password", 'error')
|
||||||
return render_template('login.html', form=form)
|
return render_template('login.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/logout/')
|
@auth.route('/logout/')
|
||||||
@login_required
|
@login_required
|
||||||
def logout():
|
def logout():
|
||||||
logout_user()
|
logout_user()
|
||||||
flash("You have been logged out.")
|
flash("You have been logged out.")
|
||||||
return redirect(url_for('.home'))
|
return redirect(url_for('home.index'))
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/oauth/token', methods=['POST'])
|
@auth.route('/oauth/token', methods=['POST'])
|
||||||
def issue_token():
|
def issue_token():
|
||||||
return authorization.create_token_response()
|
return authorization.create_token_response()
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/oauth/revoke', methods=['POST'])
|
@auth.route('/oauth/revoke', methods=['POST'])
|
||||||
def revoke_token():
|
def revoke_token():
|
||||||
return authorization.create_endpoint_response('revocation')
|
return authorization.create_endpoint_response('revocation')
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/oauth/authorize', methods=['GET', 'POST'])
|
@auth.route('/oauth/authorize', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def authorize():
|
def authorize():
|
||||||
user = current_user
|
user = current_user
|
||||||
@ -75,11 +61,3 @@ def authorize():
|
|||||||
grant_user = user
|
grant_user = user
|
||||||
|
|
||||||
return authorization.create_authorization_response(grant_user=grant_user)
|
return authorization.create_authorization_response(grant_user=grant_user)
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/api/me')
|
|
||||||
@require_oauth('profile')
|
|
||||||
def api_me():
|
|
||||||
user = current_token.user
|
|
||||||
return jsonify(id=user.id, username=user.username)
|
|
||||||
|
|
4
website/home/__init__.py
Normal file
4
website/home/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from flask import Blueprint
|
||||||
|
|
||||||
|
home = Blueprint('home', __name__, template_folder='templates')
|
||||||
|
from . import routes
|
25
website/home/routes.py
Normal file
25
website/home/routes.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from . import home
|
||||||
|
from flask import Blueprint, render_template, jsonify
|
||||||
|
from flask_login import current_user
|
||||||
|
from authlib.integrations.flask_oauth2 import current_token
|
||||||
|
from ..auth.oauth2 import require_oauth
|
||||||
|
|
||||||
|
|
||||||
|
@home.route('/')
|
||||||
|
def index():
|
||||||
|
user = None
|
||||||
|
if current_user.is_authenticated:
|
||||||
|
clients = current_user.clients
|
||||||
|
user = current_user.name
|
||||||
|
else:
|
||||||
|
clients = []
|
||||||
|
|
||||||
|
return render_template('home.html', user=user, clients=clients)
|
||||||
|
|
||||||
|
|
||||||
|
@home.route('/api/me')
|
||||||
|
@require_oauth('profile')
|
||||||
|
def api_me():
|
||||||
|
user = current_token.user
|
||||||
|
return jsonify(id=user.id, username=user.username)
|
||||||
|
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
{% if user %}
|
{% if user %}
|
||||||
<style>pre{white-space:wrap}</style>
|
<style>pre{white-space:wrap}</style>
|
||||||
<div>Logged in as <strong>{{user.name}}</strong> (<a href="{{ url_for('.logout') }}">Log Out</a>)</div>
|
<div>Logged in as <strong>{{user.name}}</strong> (<a href="{{ url_for('auth.logout') }}">Log Out</a>)</div>
|
||||||
|
|
||||||
<br/><div><h3>Clients:</h3>
|
<br/><div><h3>Clients:</h3>
|
||||||
{% for client in clients %}
|
{% for client in clients %}
|
||||||
@ -25,7 +25,7 @@
|
|||||||
<br/></div>
|
<br/></div>
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<br><p>Please, <a href="{{ url_for('.login') }}">Login</a></p>
|
<br><p>Please, <a href="{{ url_for('auth.login') }}">Login</a></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</body>
|
</body>
|
Loading…
Reference in New Issue
Block a user