Skip to content
This repository was archived by the owner on Apr 13, 2022. It is now read-only.

Proposal: a protocol to obtain Bearer access tokens for HTTP Authorization for the AJAX/API/bot use caseย #25

@zenomt

Description

@zenomt

the example-workflow.md document leaves unspecified how an application or automatic client (like an in-browser AJAX client where no cookie exists or can be used, or a server-side application with its own WebID (like a bot)) obtains an access credential when presented with a 401 Unauthorized response from a resource server.

node-solid-server, oidc-op, and oidc-rp together address this case in a currently undocumented (experimental?) way, described in #24. summary: "a proof-of-possession token is manufactured by the client and presented directly as a bearer token".

i'd like to propose an alternative method that is more in line with the spirit of OAuth, and which also uses proof-of-possession. i've (re)written a full protocol proposal at WebID HTTP Authorization Protocol. highlights of this protocol and capabilities it enables include:

  • the client must sign a challenge chosen by the resource server to prove immediate possession of the private challenge key;
  • the server, rather than the client, chooses the validity period of the access token;
  • provides an extensible framework for obtaining access tokens using different authentication mechanisms (for example, the spec includes a method to authenticate and obtain a bearer token using WebID-TLS, but that's beyond the scope of this Issue);
  • an optional HTTP 302 redirect-based token delivery mode that can be used to establish an application identifier, especially in case the proposal at Proposal: recommend WebID OpenID Providers include redirect_uri in audience list to distinguish web appsย #23 is rejected or not widely implemented (or for WebID-TLS);
  • the server (or its authorization delegate) can choose the format/representation/length of the token, for example to fit in with existing authorization infrastructure or to work optimally in the server's implementation;
  • the server can revoke its own access tokens trivially;
  • the server can require (and manage/revoke) different access tokens for different protection spaces it may serve, consistent with HTTP authorization semantics -- these tokens could be generated and validated by different authorization subsystems running in the server and have independent lifetimes.

summary of the protocol (please see zenomt/webid-auth-protocol for a full description):

  1. try to access restricted resource;
  2. get 401 Unauthorized, and a WWW-Authenticate response header that includes a challenge nonce and a token-exchange endpoint URI;
  3. create and sign a proof-of-possession token that includes the challenge nonce and the URI you were trying to access (and your OIDC identity token);
  4. exchange the proof-token for a Bearer access token (with its own expiration time);
  5. use this token in Authorization headers for requests to the same protection space, until it expires.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions