-
Notifications
You must be signed in to change notification settings - Fork 21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
How can verifiers that support multiple trust models/ecosystems know how to authenticate to the wallet? #248
Comments
And to copy across Torsten's comment with one idea for a solution: This proposal is based on a discussion with @jogu @martijnharing @awoie @danielfett @bc-pi: We would like to omit canonicalization of the request, that's why the basis of the proposal is to use the multi signature feature provided by the JWS JSON Serialization. The OID4VP request
would not contain
Every "signatures" object has the additional data for a certain RP authentication credential (protected or unprotected). Open Questions:
|
I support this.
yes
I prefer less code paths |
Only in the context of the advanced request URI POST retrieval mode (sorry I can't remember the terminology).
Yes, keep JWS Compact Serialization. |
In the sample provided by @jogu above, if the same key pair is used to sign the request in both the "client_id_scheme" = "x509_san_dns" and "client_id_scheme" = "entity_id" we have to sign the request twice and the client technically identifies in two different ways even though it is the same software. Personally I think this will led to a piece of client software proliferating how they identify with wallets when in actual reality the only thing different is how the client is choosing to authenticate its request toward a wallet. What I believe is a simpler model is the following.
Whereby the protected header in this case contains the x5c parameter with an associated certificate chain for authenticating the signed request. The wallet processing the request can then decide how from the options provided it would like to authenticate the client, via resolution of its public keys from its metadata document OR via x509 certificate chain validation. |
@tplooker Can you explain how your approach covers scenario 2 above please, i.e. "For each client_id_scheme, the verifier may have more than one way to authenticate, e.g. for x509_san_dns they may have a x509 certificate suitable for use in California and a second one suitable for use in the EU." |
In the event you are signing the request with different keys or associated certificate chains, then you would use the multiple signatures feature, but the request would be from one client_id identified in the payload. |
Right, I see, but then how is the client_id allocated to/selected by the wallet? Are we saying the wallet can say "My client id is www.example.com but actually I'm going to authenticate to you as preregistered client id you allocated 24t3gerge5y346" or "my client id is www.example.com but actually I use did:key:z6MkjBWPPa1njEKygyr3LR3pRKkqv714vyTkfnUdP6ToFSH5 as my identifer to authenticate"? |
for vanilla openid4vp, didn't we solve this with request_uri_method=post? where the wallet can tell its trust framework when obtaining the request object? and for openid4vp browser api profile, there is already an array where you can send multiple requests? |
Unfortunately not, there's clauses like this:
which prevent the verifier changing it's client_id or client_id_scheme at the point where it knows what the wallet would support. Even if we fixed that, it doesn't really deal with a wallet that might support multiple trustframeworks and the verifier has no way to know which of the trustframeworks it might need to use to (say) get the user's driving license.
I think it was definitely one of the original proposed approaches, but it was discarded and I'm struggling to remember the reason why. I think there was doubt as to whether browsers will actually support having multiple requests with |
then my suggestion would be to consider change the text you quote to say that there is no need to include client_id in the first request from the verifier to the wallet, only request_uri. then when the wallet sends a POST to the request_uri, it can include the trust framework. |
We'd need to do this for the suggestion in this issues to work too. Currently in request_uri_method=post there's not actually a defined way the wallet can communicate which trust framework(s) it supports. Probably we should actually define something if we want this to work. But following that path would mean the browser API and native oid4vp work in quite different ways, which might not be desirable (i.e. it makes the code more complex for implementors who want to support both). |
What I was meaning to say is "My client id is www.example.com and you have multiple ways you can trust me, heres how, I have one signature over the same request that tree's into this ecosystem and another into this ecosystem, im still the same software regardless". |
We kept the client id in the initial request to allow the wallet, if possible, to apply a whitelist to the request_uri parameter. As far as I remember, we wanted to prevent attackers to let the wallet send requests to attacker selected locations. |
so, what method does the wallet use to decide if the verifier is trusted sufficiently to display a consent message to the user? |
As the question came up in the call today, here is the rational for this feature as fas as I remember from the initial discussions: I hope that informs further discussions. |
This points out the impossibility of using a URI for the client ID. URI as ID has never been a good idea, but it worked in the closed environment (a few big IDPs) where OIDC worked. It is important to get a verifier ID that is not dependant on the digital ecosystem, and specifically not dependant on the internet, but is designed to work with any pattern, anywhere in the world. |
discussed in a WG, agreed on the requirements/problem statement:
there were opinions that above also applies when there is a request for one credential that might be one or the other trust framework, there were opinions that this one can be solved by multiple DCQL queries, or multiple requests over the Digital Credentials API. please open a separate issue on this (if there is not one already) |
Here is another idea, based on trust and truth. It is a variant of what we implemented. There are 4 options, trusted RP tells the truth about its trusted ID, Trusted RP makes a mistake and gives wrong untrusted ID (e.g. typo), Untrusted RP lies and gives a fake untrusted ID, Untrusted RP lies and gives a trusted ID. |
Here is the PR #308. |
This is split out from openid/oid4vc-haip#133 :
This doesn't seem to be an mdl specific thing, there is a general problem that a verifier must submit a request to the wallet without knowing anything about the wallet, and, for example, obtaining an mdl regardless of where the mdl was issued/what wallet it is in means:
client_id_scheme
and cannot know which one(s) the wallet(s) installed on the user's device support (e.g. for mdl USA states likely require x509_san_dns, some parts of the EU may well use OID Federation instead, and for non-mdl cases there may be even more deviation - this may also mean that the client_ids differ as, for example, there isn't a client_id that is valid for both x509_san_dns and openid federation)The text was updated successfully, but these errors were encountered: