Skip to main content

On This Page

Implementing OAuth 2.0 Device Flow for Input-Constrained Environments

2 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

OAuth 2.0 – Device flow explained for Engineers, especially for Backend Engineers

The OAuth 2.0 device authorization grant allows devices like Smart TVs and CLIs to authenticate users without direct credential input. It functions by decoupling the authorization session from the device, utilizing a short user code and an external browser for secure login.

Why This Matters

Traditional OAuth flows fail in environments lacking a browser or complex input methods, forcing users to endure ‘remote-control circus’ password entry. Engineers must move beyond simple password prompts to this asynchronous polling model to provide secure UX, which requires careful handling of rate limits and atomic state transitions to prevent brute-force attacks on short user codes.

Key Insights

  • The flow utilizes a two-step process: requesting a device/user code and then polling the token endpoint until the user approves the request.
  • User codes should be 8 to 9 alphanumeric characters with confusing characters like 0, O, I, and 1 removed to optimize for human readability.
  • The RFC specifies that clients receiving a ‘slow_down’ error must increase their polling interval by a minimum of 5 seconds to avoid being flagged as abusive.
  • Security at the verification URI is critical; endpoints must implement per-IP and per-session rate limiting to prevent brute-forcing of active user codes.
  • Device flow differs from PKCE in that it is designed specifically for input-constrained devices, though both can be used together for public clients.

Working Examples

Initial request from the CLI to the authorization server to start the device flow.

POST /oauth/device_authorization HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
client_id=mycli-prod&scope=read:repos%20write:repos

Server response containing codes and polling instructions.

{
"device_code": "GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS",
"user_code": "WDJB-MJHT",
"verification_uri": "https://example.com/device",
"verification_uri_complete": "https://example.com/device?user_code=WDJB-MJHT",
"expires_in": 1800,
"interval": 5
}

CLI polling the token endpoint to check if the user has completed authorization.

POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:device_code
&device_code=GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS
&client_id=mycli-prod

Practical Applications

  • CLI tools like ‘gh auth login’ or ‘aws sso login’ use this flow to authenticate via a local browser rather than requiring personal access tokens. Pitfall: Ignoring the ‘slow_down’ response in production can lead to the client being flagged as abusive.
  • Smart TV apps like Netflix and Spotify use device flow to allow login via mobile phone. Pitfall: Failing to expire the user_code immediately upon consumption can lead to transactional bugs and security vulnerabilities.

References:

Continue reading

Next article

Unified Airdrop Eligibility: Bridging Browser Tools and LLMs via MCP

Related Content