The design implications of ApiKey vs. List<ApiKey>
When building a system with API Keys, you need to consider a seemingly trivial design question. Consider the two class diagram options on the right. We have a user’s account and we need to allow access to a certain resource. We do that using an API Key. Fairly simple and standard, to be honest.
We have a deceptively simple choice. We can have a single API key per user or multiple keys. If we go with multiple keys, we have to manage a list of them (track their use separately from the account, etc). If we have a single key, we can just threat API Key as a synonym to the account. If you are using a relational database, it is also the different from having a simple column to having a separate table that you’ll need to join to.
A single API Key is simpler to the developer building the service. It is not an uncommon choice, and it is also quite wrong for you to go that way.
Consider the case of key rotation. That is something that is generally recommended to do on a regular basis. If you have a single API Key for an account, how are you going to make the switch? Updating the single field will cause all the requests that use it to fail. But there is going to be some delay between setting the API Key and being able to update all the services that uses it.
A model that allow you to have multiple API Keys is much easier. Add the new API Key to the service, update your systems to reflect the new API key (which you can do at your leisure, without the rush to update failing systems) and then remove the old API Key.
There are other reasons why you would want multiple API Keys, but the operational flexibility of being able to rotate them without breaking with world is key.
Comments
This is why all data stores, document or otherwise, really need an array datatype for storage of fields (e.g. Postgres has one, and I wish SQL Server did as well). Sometimes another table to store some list of simple data associated with an entity is unnecessary overhead.
Comment preview