OA4MP is an OAuth 2 issuer, meaning that it creates tokens. It must set itself as the originator of the token by asserting an iss claim wherever needed. E.g., https://math.bigstate.edu/oauth2. A common situation is that an institution requires that the issuer be scoped to itself (so all of the tokens used by group X have an issuer indicated they were created for group X) and have its own set of signing keys. The issuer claim reflects this, e.g. If the Geometry group at Big State University wanted to set up a token issuer for all of its users, a reasonable iss claim in the tokens would be https://math.bigstate.edu/oauth2/geometry. Specialized issuers are really quite handly since they can ensure that tokens can be ignored or not misued. As such, once savored, people tend to want to have an issuer for each and every project, group, department, you name it.
What we don't want is a proliferation of services, with, say, an install for every issuer since that makes for a vast and unremitting maintenance headache. For one thing, there must be a discovery (aka .well-known) page for the issuer that is different from the main page of the server. Keys have to generated, managed and all of the little tasks multiply rapidly and are not trivial. Fortuantely, OA4MP supports virtual issuers aka VI in the sequel. This makes adding a virtual issuer quite straightforward. You install OA4MP, then create all the virtual issuers you want or need.
This is simply a facility that takes some basic information about what the issuer should do and does it. Much of the machinery is auto-generated by OA4MP so setting up a virtual issuer for an organization is quite simple. Indeed, it usually just works.
It is important to understand that if an admin clients use virtual issuers, and then all of the clients it manages us the VI as well. This makes it easy to manage a large system of clients who have specialized signing requirements. (Historical note, these were called virtual organization for a time, but that names was taken over by other projects unrelated to OA4MP, causing confusion. We hence switched to calling these virtual issuers. If you run into the term virtual organization, let us know to fix it and rock on.)
After you create a VI, you simply set it for the admin client using the add_admin command in the CLI (in the vi component). This does all the necessary bookkeeping. Note that if an admin client is set to use a virtual issuer, every client it administers automagically now uses that issuer. A practical ramification is that if you convert an admin to using a VI, then any existing flows may break. It is therefore best to set up the VI and the admin(s) before actually creating clients. On the other hand, it does give a great way to move all of your clients to using a VI in one fell swoop.
You need to use the CLI for this. Important prerequisites are that you know what the issuer's name (simple strings are best, such as cern or jpl. Remember that these will end up in URIs as part of identifiers, so complex escaping will make it unreadable.
As per the RFC 8414 specification, the main discovery page for the OA4MP server hosted at https://math.bigstate.edu would be https://math.bigstate.edu/.well-known/openid-configuration. If you have a virtual issuer name geometry then the discovery page must be located at https://math.bigstate.edu/.well-known/openid-configuration/geometry. Internally, OA4MP will generate these live at https://math.bigstate.edu/oauth2/.well-known/openid-configuration/geometry (assuming you deployed OA4MP to the standard endpoint of oauth2) and simply return requests for the VI's discovery page. This allows you to always just check what is actually there.
In this case OA4MP has been set up at the (mythical) university of Edgestow. The task is to create an issuer for an installed OA4MP server (at https://math.edgestow.edu/oauth2). In the example that follows, lines of input are numbered and the section after has commentary on each line. This seems to be the most readable way to do it. Output from the CLI is not numbers, only user input.
0. oa4mp>use vi 1. vi>create edgestow:geometry 2. object created, edit (y/n)?y Update the values. A return accepts the existing or default value in []'s For properties you can type /help or --help and print out the online help for the topic. 3. enter the identifier[edgestow:geometry]: 4. enter description[--]:Issuer for Differential Geometry at the University of Edgestow 5. enter the title[--]:Issuer for Differential Geometry at the University of Edgestow 6. enter the issuer[--]:https://math.edgestow.edu/oauth2/geometry 7. enter the access token issuer[https://math.edgestow.edu/oauth2/geometry]: 8. enter the discovery path. NOTE this should be of the form host/path e.g.cilogon.org/ligo:[--]:math.edgestow.edu/geometry 9. Did you want to specify a file with the JSON web keys(y/n)[n]: 10. Did you want to create a new set?[n]:y 11. enter type RSA or EC:[RSA]: 12. Enter key size (default is 2048) Found keys are: 1A11D7F309DDF102: alg =RS256, use=sig 01FF6CEA64431C8F: alg =RS384, use=sig C51F2F847B928C4B: alg =RS512, use=sig 13. enter the default key id[1A11D7F309DDF102]: here is the complete object: at_issuer : https://math.edgestow.edu/oauth2/geometry created : 1730744581287 default_key_id : 1A11D7F309DDF102 description : Issuer for Diffe... lots more lines! 14. save (y/n)? y Updates saved
enter the identifier[edgestow:geometry]:--help ----- Property: Identifier (**) A standard unique identifier for this VI. Note that any admin client in the VI will use this to identify the VI. Set it for the admin using the add_admin command. ----- enter the identifier[edgestow:geometry]:
Assuming we have an admin client whose identifier is oa4mp:/admin/edgestow/geometry The proper sequence to set the above VI is
vi>set_id edgestow:geometry vi>add_admin oa4mp:/admin/edgestow/geometry virtual issuer "edgestow:geometry" set for admin with id "oa4mp:/admin/edgestow/geometry"
This corresponds to the attribute discovery_path in the CLI's record for the VI. This has a slightly different syntax than you might expect. It is of the form
host/vi
E.g. if your server is deployed at math.bigstate.edu and your vi is geometry, then the entry is
math.bigstate.edu/geometry
Why specify the path? Because OA4MP can live in quite exotic configurations and this tells the system how to generate the general page as expected by the clients. If you have a single instance of OA4MP running, just use the host name and be done with it.
For instance, there may be half a dozen OA4MP instances on different servers with completely random names that are behind a load balancer that presents itself as the service at math.bigstate.edu. Requests to this endpoint are forwarded by the load balancer to one of these OA4MP instances. The generated response should have actual name of the service, not that of the local machine servicing the request.