IndieAuth Sign-In Workflow


The basic flow for a user signing in to an application is as follows.

  • The user enters their personal URL in the sign-in form of the application.
  • Discovery: The application fetches the URL and finds the user’s authorization endpoint.
  • Authorization Request: The application directs the user’s browser to the authorization endpoint discovered, as a standard OAuth 2.0 Authorization Grant along with the user’s URL entered in the first step.
  • Authentication/Approval: The user authenticates at their authorization endpoint and approves the login request. The authorization server generates an authorization code and redirects back to the application’s redirect URL.
  • Verification: The application checks the code at the authorization endpoint, similar to exchanging the code for an access token, except no access token is returned since this is just a check for authentication. The authorization endpoint responds with the full URL of the user who authenticated.

Authentication Request

When the application builds the URL to authenticate the user, the request looks very similar to the OAuth authorization request, except no pre-registration of the client is necessary, and the request will also include the user’s profile URL. The URL will look like the below.

The authorization server will then ask the user to log in, as normally happens with OAuth flows, and then ask the user if they would like to continue signing into the app, as shown below.

If the user approves, they will be redirected back to the application with an authorization code (and the app’s state value) in the query string.

The app will then take the authorization code and verify it with the authorization endpoint, in order to confirm the identity of the user that signed in. The app makes a POST request to the authorization endpoint with the code, client_id and redirect_uri, just like a normal authorization code exchange.

POST /auth
Content-type: application/x-www-form-urlencoded


The response will be a simple JSON object with the user’s full profile URL.

HTTP/1.1 200 OK
Content-Type: application/json

  "me": ""

See for more details about handling the request and response.