solid / webid-oidc-spec

WebID-OIDC Authentication Spec v0.1.0
MIT License
56 stars 18 forks source link

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

Open zenomt opened 5 years ago

zenomt commented 5 years ago

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:

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.
kjetilk commented 5 years ago

Thanks a lot for writing this up! It caused confusion and pain to me as well when starting to write a test suite. I think we need to fix this.

jaxoncreed commented 5 years ago

@sylvainlb This might be interesting to you

jaxoncreed commented 5 years ago

@zenomt When you say "the server, rather than the client, chooses the validity period of the access token;" Is the server the RS or the OP?

zenomt commented 5 years ago

@jaxoncreed the resource server chooses the validity period of the access tokens it issues. the validity period of its access tokens could be shorter or longer than the validity period of the presented proof-tokens. the reasoning is: the access policy of the resource server is up to the resource server, not to the client or the client's OIDC Provider.

zenomt commented 5 years ago

to be more precise, the access token is issued by the webid_pop_endpoint, which is the resource server's authorization server. the resource server could be its own authorization server, or (in some deployments, like enterprise systems) the authorization server could be a centralized service to which multiple resource servers are coupled.

this separation is more obvious with the webid_tls_endpoint, where for it to be useful in the real world it needs to have a different origin than the resource server (so the authorization server can ask for a client certificate). the webid_tls_endpoint authorization server could be a virtual host on the same actual server, or it could be on a completely different server.

zenomt commented 5 years ago

i struck out the "302 redirect" mode above as a "highlight" of the protocol (though it's still present). that mode isn't useful to establish an application identifier with the webid_pop_endpoint. i've modified the spec, including the Syntax, Operation, and Security Considerations sections to explain why. also in the Security Considerations section is an explanation as to why you can't believe the Origin header for any Bearer-type authorization scheme, not just this one.

zenomt commented 5 years ago

unfortunately the minutes from this morning's Solid Community call were lost, and i don't remember who asked about it, but i have added a sequence diagram for the WebID-OIDC access token case to the https://github.com/zenomt/webid-auth-protocol .

michielbdejong commented 5 years ago

Great! It was @bblfish who asked "(Henry) Is there a sequence diagram as part of the spec?"

TallTed commented 5 years ago

@zenomt - It can be helpful to ping the group for anyone who has personal IRC logs (as I would have, were I logged in to IRC at the time) ... or, if RRSAgent was present, to ping W3 admins for help locating the bot's log. W3 admins can usually also help with processing anyone's IRC logs into minutes via the scripts.

kjetilk commented 5 years ago

Ah, I am always on, even if I'm not on present :-) But it seems it is in the minutes? Anything else that was lost?

zenomt commented 5 years ago

i updated my full proposal based on https://github.com/solid/webid-oidc-spec/issues/12#issuecomment-502723430 which is a cleaner method of determining the appid from the id_token audience than i had originally proposed. i'm still proposing that the redirect_uri be the appid and that it is present in the id_token aud list.