Bird
Raised Fist0
Flaskframework~30 mins

OAuth2 overview in Flask - Mini Project: Build & Apply

Choose your learning style10 modes available
OAuth2 Overview with Flask
📖 Scenario: You are building a simple Flask web app that uses OAuth2 to let users log in with a third-party service.This project will guide you through setting up the basic OAuth2 flow in Flask.
🎯 Goal: Create a Flask app that sets up OAuth2 client configuration, defines a login route to start OAuth2 authorization, and a callback route to handle the OAuth2 response.
📋 What You'll Learn
Create a dictionary called oauth_config with OAuth2 client details
Create a variable called redirect_uri with the callback URL
Use requests_oauthlib.OAuth2Session to create an OAuth2 session with the client ID and redirect URI
Define Flask routes /login and /callback to handle OAuth2 authorization and response
💡 Why This Matters
🌍 Real World
OAuth2 is widely used to let users log in to apps using accounts from Google, Facebook, GitHub, and many other providers without sharing passwords.
💼 Career
Understanding OAuth2 and how to implement it in web frameworks like Flask is essential for building secure, user-friendly authentication in modern web applications.
Progress0 / 4 steps
1
Set up OAuth2 client configuration
Create a dictionary called oauth_config with these exact keys and values: 'client_id' set to 'your_client_id', 'client_secret' set to 'your_client_secret', 'authorization_base_url' set to 'https://provider.com/oauth2/auth', and 'token_url' set to 'https://provider.com/oauth2/token'.
Flask
Hint

Use a Python dictionary with the exact keys and values given.

2
Define the redirect URI
Create a variable called redirect_uri and set it to the string 'http://localhost:5000/callback'.
Flask
Hint

Set the redirect URI exactly as shown.

3
Create OAuth2 session
Import OAuth2Session from requests_oauthlib. Then create a variable called oauth by calling OAuth2Session with oauth_config['client_id'] and redirect_uri=redirect_uri.
Flask
Hint

Remember to import OAuth2Session before using it.

4
Define Flask routes for login and callback
Import Flask, redirect, and request from flask. Create a Flask app called app. Define a route /login that uses oauth.authorization_url with oauth_config['authorization_base_url'] to get the authorization URL and state, then redirects the user to the authorization URL. Define a route /callback that fetches the token using oauth.fetch_token with oauth_config['token_url'], client_secret=oauth_config['client_secret'], and authorization_response=request.url. Return a simple string 'Login successful' in the callback route.
Flask
Hint

Define the Flask app and routes exactly as described to handle OAuth2 login and callback.

Practice

(1/5)
1. What is the main purpose of OAuth2 in a Flask application?
easy
A. Store user passwords securely in the Flask app database
B. Allow users to log in using external services without sharing passwords
C. Encrypt all data sent between client and server
D. Automatically create user accounts without permission

Solution

  1. Step 1: Understand OAuth2 role

    OAuth2 lets apps use other services for login without handling user passwords directly.
  2. Step 2: Identify correct purpose in Flask context

    Flask apps use OAuth2 to let users sign in via external providers safely.
  3. Final Answer:

    Allow users to log in using external services without sharing passwords -> Option B
  4. Quick Check:

    OAuth2 = external login without password sharing [OK]
Hint: OAuth2 means login without storing passwords [OK]
Common Mistakes:
  • Thinking OAuth2 stores passwords
  • Confusing OAuth2 with encryption
  • Assuming OAuth2 creates accounts automatically
2. Which Flask extension is commonly used to simplify OAuth2 integration?
easy
A. Flask-WTF
B. Flask-SQLAlchemy
C. Authlib
D. Flask-Mail

Solution

  1. Step 1: Recall Flask extensions for OAuth2

    Authlib is a popular Flask extension designed to handle OAuth2 easily.
  2. Step 2: Eliminate unrelated extensions

    Flask-SQLAlchemy manages databases, Flask-WTF handles forms, Flask-Mail sends emails, so they don't handle OAuth2.
  3. Final Answer:

    Authlib -> Option C
  4. Quick Check:

    OAuth2 in Flask = Authlib [OK]
Hint: Authlib is for OAuth2 in Flask [OK]
Common Mistakes:
  • Choosing Flask-SQLAlchemy for OAuth2
  • Confusing form or mail extensions with OAuth2
  • Not knowing Authlib's purpose
3. Given this Flask OAuth2 code snippet, what will print(user_info) output after successful login?
from authlib.integrations.flask_client import OAuth
app = Flask(__name__)
oauth = OAuth(app)
google = oauth.register('google', client_id='id', client_secret='secret', access_token_url='https://accounts.google.com/o/oauth2/token', authorize_url='https://accounts.google.com/o/oauth2/auth', api_base_url='https://www.googleapis.com/oauth2/v1/', client_kwargs={'scope': 'openid email profile'})

@app.route('/login')
def login():
    redirect_uri = url_for('authorize', _external=True)
    return google.authorize_redirect(redirect_uri)

@app.route('/authorize')
def authorize():
    token = google.authorize_access_token()
    user_info = google.get('userinfo').json()
    print(user_info)
    return 'Logged in'
medium
A. Empty dictionary because token is invalid
B. An error because 'userinfo' endpoint is missing
C. A string 'Logged in' printed to console
D. A dictionary with user's email, name, and profile info

Solution

  1. Step 1: Understand OAuth2 flow in code

    After login, the app gets an access token and calls 'userinfo' endpoint to get user data as JSON.
  2. Step 2: Analyze user_info content

    The google.get('userinfo').json() returns a dictionary with user details like email and name.
  3. Final Answer:

    A dictionary with user's email, name, and profile info -> Option D
  4. Quick Check:

    OAuth2 userinfo call = user data dict [OK]
Hint: OAuth2 userinfo returns user data dictionary [OK]
Common Mistakes:
  • Expecting a string instead of dictionary
  • Assuming endpoint is missing
  • Thinking token is invalid without error
4. What is wrong with this Flask OAuth2 snippet?
@app.route('/authorize')
def authorize():
    token = google.authorize_access_token
    user_info = google.get('userinfo').json()
    return user_info
medium
A. Missing parentheses when calling authorize_access_token
B. Using 'userinfo' instead of 'user_info' endpoint
C. Returning JSON directly causes syntax error
D. No redirect URI specified in authorize route

Solution

  1. Step 1: Check method call syntax

    The code uses google.authorize_access_token without parentheses, so it references the method, not calls it.
  2. Step 2: Understand effect of missing parentheses

    Without calling the method, token is a function object, causing errors later.
  3. Final Answer:

    Missing parentheses when calling authorize_access_token -> Option A
  4. Quick Check:

    Method call needs () [OK]
Hint: Always add () to call methods [OK]
Common Mistakes:
  • Forgetting parentheses on method calls
  • Confusing endpoint names
  • Assuming JSON return causes error
5. You want your Flask app to request only the user's email and profile during OAuth2 login with Google. Which scope value should you use when registering the OAuth client?
hard
A. 'openid email profile'
B. 'read write'
C. 'user:email user:profile'
D. 'email profile openid offline_access'

Solution

  1. Step 1: Identify correct OAuth2 scopes for Google

    Google uses 'openid email profile' scopes to request user's email and profile info.
  2. Step 2: Eliminate incorrect scopes

    'read write' is generic, 'user:email user:profile' is GitHub style, 'offline_access' requests refresh tokens, not needed here.
  3. Final Answer:

    'openid email profile' -> Option A
  4. Quick Check:

    Google OAuth2 scopes for email/profile = 'openid email profile' [OK]
Hint: Use 'openid email profile' for Google OAuth2 scopes [OK]
Common Mistakes:
  • Using GitHub or generic scopes
  • Adding unnecessary offline_access scope
  • Confusing scope syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard