|
1 | 1 | import os
|
| 2 | +import requests |
2 | 3 |
|
3 |
| -from flask import Flask |
4 |
| -from flask import jsonify |
5 |
| -from flask import request, url_for, redirect, session |
6 |
| -from flask_login import logout_user |
| 4 | +from flask import Flask, session, url_for, abort, redirect, request |
7 | 5 |
|
8 | 6 | from authenticator.adapters.db import api as db_api
|
9 |
| -from authenticator.adapters.login import loginmanager |
| 7 | +from authenticator.adapters.login import google_adapter |
10 | 8 | from authenticator.utils import utils
|
11 | 9 |
|
12 | 10 | database = os.environ.get("db", "authenticator")
|
|
16 | 14 | app = Flask(__name__)
|
17 | 15 | app.config["MONGO_URI"] = f"mongodb://{host}:{port}/{database}"
|
18 | 16 | app.config["SECRET_KEY"] = "b9dd1b2f"
|
| 17 | +os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" |
19 | 18 | app.config["GOOGLE_CLIENT_ID"] = os.environ.get("GOOGLE_CLIENT_ID", None)
|
20 | 19 | app.config["GOOGLE_CLIENT_SECRET"] = os.environ.get("GOOGLE_CLIENT_SECRET", None)
|
21 | 20 |
|
22 | 21 |
|
23 | 22 | db_obj = db_api.MongoAdapters(app)
|
24 |
| -login_obj = loginmanager.loginManager(app) |
| 23 | +google_adapter_obj = google_adapter.GoogleLoginAdapter() |
| 24 | + |
| 25 | + |
| 26 | +def login_is_required(function): |
| 27 | + def wrapper(*args, **kwargs): |
| 28 | + if "google_id" not in session: |
| 29 | + return abort(401) # Authorization required |
| 30 | + else: |
| 31 | + return function() |
| 32 | + |
| 33 | + return wrapper |
25 | 34 |
|
26 | 35 |
|
27 | 36 | @app.route("/users", methods=["GET"])
|
28 | 37 | def get_users():
|
29 | 38 | return db_obj.get_all_users()
|
30 | 39 |
|
31 | 40 |
|
32 |
| -@app.route("/", methods=["GET"]) |
| 41 | +@app.route("/") |
33 | 42 | def index():
|
34 |
| - return "Welcome to nomad Authenticator." |
| 43 | + return "Hello World <a href='/googlelogin'><button>Sign Up with google</button></a>" |
35 | 44 |
|
36 | 45 |
|
37 |
| -def add_users(name, email, provider): |
| 46 | +def add_users(name, email, provider=None, provider_id=None): |
38 | 47 |
|
39 |
| - print("HELOO") |
40 | 48 | return db_obj.add_users(
|
41 |
| - name, email, utils.get_current_time(), provider, "admin" |
| 49 | + name, email, utils.get_current_time(), "admin", provider, provider_id |
42 | 50 | )
|
43 |
| - return db_obj.add_users(name, email, utils.get_current_time(), provider, "user") |
44 |
| - |
45 |
| - |
46 |
| -@app.route("/login/google") |
47 |
| -def google_login(): |
48 |
| - login_obj.auth.register( |
49 |
| - name="google", |
50 |
| - client_id=app.config["GOOGLE_CLIENT_ID"], |
51 |
| - client_secret=app.config["GOOGLE_CLIENT_SECRET"], |
52 |
| - access_token_url="https://accounts.google.com/o/oauth2/token", |
53 |
| - access_token_params=None, |
54 |
| - authorize_url="https://accounts.google.com/o/oauth2/auth", |
55 |
| - authorize_params=None, |
56 |
| - api_base_url="https://www.googleapis.com/oauth2/v1/", |
57 |
| - userinfo_endpoint="https://openidconnect.googleapis.com/v1/userinfo", |
58 |
| - client_kwargs={"scope": "openid email profile"}, |
| 51 | + return db_obj.add_users( |
| 52 | + name, email, utils.get_current_time(), "user", provider=None, provider_id=None |
59 | 53 | )
|
60 |
| - google = login_obj.auth.create_client("google") |
61 |
| - redirect_uri = url_for("google_authorize", _external=True) |
62 |
| - return google.authorize_redirect(redirect_uri) |
63 | 54 |
|
64 | 55 |
|
65 |
| -@app.route("/login/google/authorize") |
66 |
| -def google_authorize(): |
67 |
| - google = login_obj.auth.create_client("google") |
68 |
| - try: |
69 |
| - token = google.authorize_access_token() |
70 |
| - resp = google.get("userinfo").json() |
71 |
| - return add_users(resp["name"], resp["email"], "google") |
72 |
| - except Exception: |
73 |
| - return redirect("/login/google") |
| 56 | +@app.route("/googlelogin") |
| 57 | +def login(): |
| 58 | + authorization_url, state = google_adapter_obj.flow.authorization_url() |
| 59 | + session["state"] = state |
| 60 | + return redirect(authorization_url) |
| 61 | + |
| 62 | + |
| 63 | +@app.route("/callback") |
| 64 | +def callback(): |
| 65 | + id_info = google_adapter_obj.get_basic_info(request, session) |
| 66 | + if not session["state"] == request.args["state"]: |
| 67 | + abort(500) # State does not match! |
| 68 | + |
| 69 | + name = id_info.get("name") |
| 70 | + email = id_info.get("email") |
| 71 | + google_id = id_info.get("sub") |
| 72 | + session["google_id"] = google_id |
| 73 | + session["name"] = name |
| 74 | + session["email"] = email |
| 75 | + add_users(name, email, "google", google_id) |
| 76 | + return redirect("/protected_area") |
74 | 77 |
|
75 | 78 |
|
76 | 79 | @app.route("/logout")
|
77 |
| -def user_logout(): |
78 |
| - for key in list(session.keys()): |
79 |
| - session.pop(key) |
| 80 | +def logout(): |
| 81 | + session.clear() |
80 | 82 | return redirect("/")
|
81 | 83 |
|
82 | 84 |
|
| 85 | +@app.route("/protected_area") |
| 86 | +@login_is_required |
| 87 | +def protected_area(): |
| 88 | + return ( |
| 89 | + f"Hello {session['name']}! <br/> <a href='/logout'><button>Logout</button></a>" |
| 90 | + ) |
| 91 | + |
| 92 | + |
83 | 93 | if __name__ == "__main__":
|
84 | 94 | app.run(debug=True, host="0.0.0.0", port=5000)
|
0 commit comments