-
Notifications
You must be signed in to change notification settings - Fork 16
Proposal: a protocol to obtain Bearer access tokens for HTTP Authorization for the AJAX/API/bot use caseย #25
Description
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(or for WebID-TLS);302redirect-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- 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):
- try to access restricted resource;
- get
401 Unauthorized, and aWWW-Authenticateresponse header that includes a challenge nonce and a token-exchange endpoint URI; - 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);
- exchange the proof-token for a Bearer access token (with its own expiration time);
- use this token in
Authorizationheaders for requests to the same protection space, until it expires.