OAuth Grant Types
What is a Grant Type?
The exact sequence of steps ("flow") used to get an access token. Client specifies which one it wants via response_type in the initial request. OAuth service must support it.
Scopes
Defines what data/access the client is requesting
Format is provider-specific:
scope=contacts,scope=contacts.read, full URIs, etc.For authentication use-cases → standardized OpenID Connect scopes used instead, e.g.
scope=openid profile→ grants read access to basic identity info (email, username)
1. Authorization Code Grant (most secure, server-side apps)

Core idea: Get a code first (via browser), then swap it for a token server-to-server (invisible to attacker/browser).
1. Authorization request
GET /authorization?client_id=..&redirect_uri=..&response_type=code&scope=..&state=..
Browser-based
2. Login + consent
User logs into OAuth provider, approves scopes
Auto-approved on repeat visits if session still valid
3. Authorization code grant
GET /callback?code=...&state=...
Code sent via browser redirect
4. Access token request
POST /token with client_id, client_secret, redirect_uri, grant_type=authorization_code, code
Server-to-server, secure back-channel
5. Access token grant
JSON: access_token, token_type, expires_in, scope
Not exposed to browser
6. API call
GET /userinfo with Authorization: Bearer <token>
Server-side call
7. Resource grant
JSON: username, email, etc.
Used to log user in
Key Parameters
client_id- public identifier, issued at registrationclient_secret- private, proves client's identity during token exchange (this is what makes this flow secure)redirect_uri- where code is sent; common attack surface (validation flaws)response_type=code- signals this grant typestate- anti-CSRF token; unique/unguessable, tied to client session, must match on returngrant_type=authorization_code- tells/tokenendpoint which flow this is
Why it's secure
Token + user data never touch the browser - only the one-time code does. Even if code leaks, it's useless without client_secret.
2. Implicit Grant (simpler, less secure - SPAs/native apps)

Core idea: Skip the code step entirely - token comes back directly in the redirect, via browser.
1. Authorization request
Same as above but response_type=token
2. Login + consent
Same as code flow
3. Access token grant
GET /callback#access_token=..&token_type=..&expires_in=..&scope=..&state=..
Token in URL fragment, not query string
4. API call
GET /userinfo with Authorization: Bearer <token>
Happens via browser, not backend
5. Resource grant
JSON: username, email
Client JS extracts + uses this
Why fragment (#) not query (?)
Fragments are never sent to the server by the browser (only used client-side) - deliberate design to limit token exposure to the URL/server logs. But client-side JS still must extract and handle it manually.
Why it's less secure
No
client_secretinvolved at allNo secure back-channel - everything happens via browser redirects
Token is directly exposed to browser history, extensions, referer leaks, etc.
Used only because SPAs/native apps can't safely store a
client_secret
Quick Comparison
response_type
code
token
Token exposed to browser?
No
Yes
Needs client_secret?
Yes
No
Back-channel (server-to-server)?
Yes
No
Best for
Server-side apps
SPAs / native apps
Security
Higher
Lower
Critical Recurring Concept
state= CSRF protection. Must be unguessable, tied to the user's session, and validated on return - regardless of grant type. Missing/weakstateis one of the most common OAuth vulnerabilities.
The resource server (
/userinfo) must verify the token belongs to the requesting client before returning data - this is the check that was missing in the lab you just solved.
Last updated