Offline access device flow

Use the device flow to obtain an offline-access token bundle for the principal in the caller's consumer token. The service handles its confidential OAuth client credentials; callers never send a client secret to BigFS.

Routes

Route Required fields Optional fields Result
ANY /v1/offline_access/oauth/device/issue scope, aud, label Starts a device authorization flow.
ANY /v1/offline_access/oauth/device/pickup id Returns the pending, success, or terminal state.

Both routes require a consumer token. A caller may pick up only an offline access record owned by that token's principal.

Start a device flow

Call /v1/offline_access/oauth/device/issue to receive the user-facing verification information. scope defaults to openid profile email groups offline_access when omitted or empty. aud is optional. label is a caller label stored with the request.

Field Required Type Description
scope No String Requested OAuth scopes.
aud No String Requested audience.
label No String Human-readable label for the request.
curl -sS https://api.bigfs.m7.org/v1/offline_access/oauth/device/issue \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"label":"Desktop backup"}'
{
  "status": 1,
  "data": {
    "id": "OFFLINE_ACCESS_UUID",
    "status": "pending",
    "user_code": "ABCD-EFGH",
    "verification_uri": "https://sso.user.m7.org/device_login",
    "verification_uri_complete": "https://sso.user.m7.org/device_login?user_code=ABCD-EFGH",
    "expires_in": 600,
    "interval": 5
  }
}

Show the verification URL and code to the user. Do not expose the service's OAuth client credentials.

Pick up the result

Poll /v1/offline_access/oauth/device/pickup with the returned id. Wait at least the returned interval seconds between requests. A slow_down response returns a larger interval, which replaces the previous polling interval.

Field Required Type Description
id Yes UUID Offline-access record ID from issue.

Pending example:

{
  "status": 1,
  "data": {
    "id": "OFFLINE_ACCESS_UUID",
    "status": "pending",
    "interval": 5,
    "comment": "authorization pending"
  }
}

Completed example:

{
  "status": 1,
  "data": {
    "id": "OFFLINE_ACCESS_UUID",
    "status": "success",
    "token_type": "bearer",
    "access_token": "ACCESS_TOKEN",
    "expires_in": 900,
    "refresh_token": "REFRESH_TOKEN",
    "refresh_expires_in": 2592000,
    "binding_chain": "BINDING_CHAIN",
    "binding_link": "BINDING_LINK",
    "scope": "openid profile email groups offline_access"
  }
}

Store the returned access token, refresh token, binding_chain, and binding_link securely as one package. A provider refresh requires the full package and the owning OAuth client's authentication; BigFS does not expose a public refresh route. Terminal failures return status: "error" with one of access_denied, expired_token, or the OAuth error reported by the provider. Re-picking up a completed record returns status: "success" without token values; retain the package from the first successful response.