The authorization code flow helps apps get permission to access user data safely. It keeps user passwords private by using a temporary code.
Authorization code flow in Rest API
Start learning this pattern below
Jump into concepts and practice - no test required
1. Redirect user to authorization server with client_id and redirect_uri. 2. User logs in and approves access. 3. Authorization server sends a code to redirect_uri. 4. App sends code, client_id, client_secret, and redirect_uri to token endpoint. 5. Server returns access token to app.
The authorization code is a temporary code that your app exchanges for an access token.
The redirect_uri must match what you registered with the authorization server.
GET https://auth.example.com/authorize?response_type=code&client_id=abc123&redirect_uri=https://myapp.com/callback&scope=read
POST https://auth.example.com/token Headers: Content-Type: application/x-www-form-urlencoded Body: code=AUTH_CODE&client_id=abc123&client_secret=secret&redirect_uri=https://myapp.com/callback&grant_type=authorization_code
This program shows the main steps: sending the user to authorize, getting the code, and exchanging it for an access token.
import requests # Step 1: Redirect user to this URL (simulate by printing) auth_url = ( "https://auth.example.com/authorize?" "response_type=code&" "client_id=abc123&" "redirect_uri=https://myapp.com/callback&" "scope=read" ) print(f"Go to this URL to authorize: {auth_url}") # Step 2: After user authorizes, they get a code (simulate input) authorization_code = input("Enter the authorization code you received: ") # Step 3: Exchange code for access token response = requests.post( "https://auth.example.com/token", data={ "grant_type": "authorization_code", "code": authorization_code, "redirect_uri": "https://myapp.com/callback", "client_id": "abc123", "client_secret": "secret" } ) if response.status_code == 200: token_data = response.json() print(f"Access token: {token_data.get('access_token')}") else: print(f"Failed to get token: {response.status_code}")
The authorization code flow is safer than sending tokens directly in the browser.
Always keep your client_secret private and never share it in public code.
Redirect URIs must be exact matches to prevent attacks.
The authorization code flow lets apps get permission without handling passwords.
It uses a temporary code that the app exchanges for an access token.
This flow is common for web apps needing secure access to user data.
Practice
Solution
Step 1: Understand the role of the authorization code
The authorization code is a temporary code given after user consent, not the token itself.Step 2: Identify what the app does with the code
The app sends this code to the authorization server to get an access token securely.Final Answer:
To exchange it for an access token securely -> Option AQuick Check:
Authorization code = temporary code for token exchange [OK]
- Thinking the code directly accesses data
- Confusing code with user password
- Assuming code refreshes tokens
Solution
Step 1: Recall the token exchange request
The app sends the authorization code to the token endpoint to get an access token.Step 2: Identify the HTTP method used
This request uses POST because it sends data securely in the request body.Final Answer:
POST -> Option DQuick Check:
Token exchange uses POST method [OK]
- Using GET which exposes data in URL
- Confusing PUT or DELETE with token exchange
- Assuming token exchange is a simple GET request
import requests
response = requests.post('https://auth.example.com/token', data={
'code': 'abc123',
'client_id': 'myapp',
'client_secret': 'secret',
'redirect_uri': 'https://myapp.com/callback',
'grant_type': 'authorization_code'
})
print(response.json().get('access_token'))
What will this code print if the exchange is successful?Solution
Step 1: Understand the request purpose
The code sends a POST request to exchange the authorization code for an access token.Step 2: Analyze the printed output
If successful, the server returns JSON with an 'access_token' key, which is printed.Final Answer:
The access token string from the server -> Option BQuick Check:
response.json()['access_token'] = access token [OK]
- Printing the code instead of token
- Expecting error message on success
- Not accessing JSON correctly
response = requests.get('https://auth.example.com/token', params={
'code': 'abc123',
'client_id': 'myapp',
'client_secret': 'secret',
'redirect_uri': 'https://myapp.com/callback',
'grant_type': 'authorization_code'
})
What is the main issue with this code?Solution
Step 1: Check HTTP method for token exchange
The token exchange requires a POST request to send sensitive data securely.Step 2: Identify the problem in the code
The code uses GET with query parameters, which is insecure and not standard for this flow.Final Answer:
Using GET instead of POST for token exchange -> Option CQuick Check:
Token exchange must use POST, not GET [OK]
- Using GET exposes secrets in URL
- Forgetting to send client secret
- Assuming redirect URI format is wrong
Solution
Step 1: Understand PKCE purpose
PKCE adds a code verifier and challenge to prevent interception of the authorization code.Step 2: Identify the added step in the flow
The app sends the code verifier with the token request to prove it started the flow and prevent attacks.Final Answer:
The app sends a code verifier with the token request to prove it initiated the flow -> Option AQuick Check:
PKCE adds code verifier step for security [OK]
- Thinking PKCE removes authorization code
- Confusing PKCE with password prompts
- Assuming PKCE uses implicit flow
