Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Authorization terminology is a mess: Let's fix it (idpro.org)
81 points by andychiare 6 hours ago | hide | past | favorite | 50 comments
 help



I love how the OIDC standard is littered with “authentication identity token code id cookie identifier” and many subtle variations of homonyms in slightly different combinations and orders.

I’m sure someone thought it all made perfect sense.

Probably someone who never confuses “empathy” and “sympathy” while also carefully distinguishing between “should” and “ought”.


> Probably someone who never confuses “empathy” and “sympathy” while also carefully distinguishing between “should” and “ought”.

What do you mean by this?


I feel "ought" is stronger and is something that is expected of you, but English is not my native language.

"You should drink more water"

"You ought to help your sick mother"


I'm a native speaker and I agree. "Ought" can connote an obligation or responsibility of some sort. "Should" is used more often when the outcome is out of any control. It might only be the speaker's belief.

But there is significant overlap.


That's when you turn to the RFC2119 all-caps requirement levels!

You really OUGHT to.

Not sure what's giving you a pause there?

It's going over my head, too. I don't understand what the implication of the sentence is in context.

Someone who is incredibly pedantic and also specific about their word use, who doesn't have a problem with four different descriptions because they all elide to the same thing. ie someone who should have more sympathy AND empathy even if they can disambiguate the terms (for their audience.)

> Someone who is incredibly pedantic

> they all elide to the same thing

I see what you did there: https://en.wiktionary.org/wiki/elide#Usage_notes

Current article title: Authorization terminology is a mess: Let's fix it

That being said, GP mentions OIDC Connect, which is indeed a standard using jargon, just like the IETF uses jargon, and when a standard uses or invents jargon, it makes an effort to define that terminology, and also delineate when it's being used.

https://openid.net/specs/openid-connect-core-1_0.html#Termin...

If someone believes that standards and specifications are written by pedantic people who are precious about the definitions of words, they may also be likely to fire their attorney during a court case, because that attorney just refuses to use plain English in the courtroom.


https://xkcd.com/927

Nice work and all regardless


Quite literally the first thing that jumped to my mind when I read the title

Is the article inventing any new words?

Another take I like is "The good thing about standards is there are many to choose from!"

turns out naming is important

I'm maintaining a document called Tricksy words with multiple meanings that cause endless confusion and strife

Just in the past year I have wasted several months pulling my hair out due to incorrectly named projects.

It really does turn out naming is important!


I've seen a spreadsheet with NATO abbreviations and terms. It's tens of thousands of entries. And the best ones have tens of definitions.

Care to share some highlights?

I've worked at places where it turned out different parts of the organization had a different idea of what a "user" of the core product was.

The team using Salesforce, the data warehouse team, the application development teams, all with different mental models of what "we added 5,000 users today" actually meant in concrete terms.


And renaming things is hard, if not impossible

> can this subject perform this action on this object?

IMHO, the most elegant method to answer this question is capability based access control. If the subject can utter the action, then it can perform it. And then delegation is the transfer of nouns and verbs to perform the utterances.


> If the subject can utter the action, then it can perform it.

This sounds like another layer of weird terminology that doesn't mean anything for someone who is not familiar with whatever capability system you're thinking of.

Say I am a user who can see a particular directory on a shared setup. I try to upload a file in this directory, using the same method that worked on another directory. The question of AuthZ is: will I be allowed to do it or not? In the plain sense of the words, I can absolutely "utter the action", I have all of the "verbs" (upload) and "nouns" (the file, the destination path). Still, I should not be allowed to perform the action if I was only given read-only access here.

Now sure, you can say that "upload to dirA" is a different verb than "upload to dirB". But this is just confusing terminology, it doesn't enlighten anything.


You seem to understand it just fine.

Your accessor, dirB, should not contain the “upload files” verb, while your dirA accessor (noun) should.

My favorite example is the home directory and the file picker. Why should a program have access to all your files by default then politely ask you which file it should read/write to? It would make more sense if the file picker was something the operating system ran when a program wants to edit a file, and what came back to the program after you selected was the accessor for that file (with read and/or write verbs).

So the program only have access to those files you have it access to. It cannot even ask the question to open another file, because it only has opaque accessors to those files it has been given.


What you're describing is essentially what the authorization system would need to do in order to answer the question "can this subject perform this action on this object?". If you're suggesting that the program should receive a list a priori, then there are potential scale issues since that list would need to be exhaustive of both nouns and verbs, which can be a large set.

The point is to flip the burden of proof.

Instead of an authorisation system trying to find a reason to give you permission, you have to carry the proof in the form of a “verb”. Which you use when you perform the action.


Right, but where do you get the proof to begin with? Using your OS example, it seems like the OS would need to precompute all of the possible accesses for the file picker? In this case, the OS is an authorization system.

Do you mean that the directory should not be responsible for making this decision and there should be a central authorization authority?


I used to use the example of Dropbox’s chooser API to illustrate this: https://www.dropbox.com/developers/chooser

If you use this API (via a simple widget library) then the user simply picks a file in their dropbox and the app gets access to that one file. Vs OAuth where you grant the app broad access to the whole dropbox (or maybe some sub-folder).


What you're describing is the difference between Fine Grained Authorization (FGA) and traditional Role-based Access Control (RBAC). This article covers the difference: https://www.osohq.com/learn/what-is-fine-grained-authorizati... (disclaimer: I used to work there but continue to be a fan of their documentation).

First of all, this necessitates a certain data model, where instead of a "UploadFile(file, destPath)" operation, I have to have a "destPath.UploadFile(file)" operation. This would be ok for this case, but not all operations can be expressed in this simple parent -> child relationship.

Furthermore, even here, this doesn't cover another case: what if I am allowed to add files to destPath, but I'm not allowed to modify a specific file? This API still has to fail if `destPath/file.Name` already exists and I'm not allowed to modify it (or it at least has to do something different than when `destPath/file.Name` doesn't already exist).

And even if we accept that we can only ever write things in this way, this still leaves the problem of terminology intact. Depending on the technology, it's simply not true that I can't "utter this phrase" if I don't have the capability. For example, if this is an HTTP API, then I can always do a `POST /dest-path/upload-file` with the file I want, regardless of whether I have the authorization to access that or not. Sure, if it's a HATEOAS-style API, the `GET /dest-path` might not return a link to `./upload-file` at all, but that doesn't mean that I can't utter that sentence - i.e. issue that HTTP request.


I have designed capability based HTTP APIs before, it took some work but the end result was ergonomic. Of course over the web the capabilities must be secured in some way. I opted for keys to prove that you can perform a given action.

So, “utter” there means make a valid request with a key. On both the client side and the server side the keys and validations were invisible to the business logic, they just carried objects as usual.

You created capabilities by registering a handler for the operation, and got back a token object you could hand out and even send over the api to those who were meant to use them. And the clients got these objects which they could just manipulate and keep around for making API requests.

The cool part was that you could never forget to do an authorisation check. The keys were automatically checked when the request came in. An API request handler would have no privilege itself, it would only call the key-validated handlers created when the capability was minted.


I have more experience with authorization than most engineers, even engineers who have some experience with authn/authz, and I have no idea what that "subject can utter the action" or "transfer of nouns and verbs to perform the utterances" could mean

They clearly mean capabilities.

https://en.wikipedia.org/wiki/Capability-based_security

> Capabilities achieve their objective of improving system security by being used in place of forgeable references. A forgeable reference (for example, a path name) identifies an object, but does not specify which access rights are appropriate for that object and the user program which holds that reference. Consequently, any attempt to access the referenced object must be validated by the operating system, based on the ambient authority of the requesting program, typically via the use of an access-control list (ACL).

> Instead, in a system with capabilities, the mere fact that a user program possesses that capability entitles it to use the referenced object in accordance with the rights that are specified by that capability. In theory, a system with capabilities removes the need for any access control list or similar mechanism by giving all entities all and only the capabilities they will actually need.


Some nice Object Capability technologies not mentioned in the Wikipedia article:

https://capnproto.org (used by Cloudflare)

https://spritely.institute/goblins (with wasm support via Hoot)

https://ocapn.org (where things come together in a future open standard)


I chose those words here because they are not programming language specific. For the OOPers, I guess you can imagine I said “objects” and “methods”.

Unclosable cookie banner. Top notch website engineering.

Would you like cookies? (No) -> You can revoke consent at any time (Revoke) -> Would you like cookies?

It’s about 20% of the vertical screen space on an iPhone, maddening.

Are you fixing it at the IETF and RFC level, or is this just another way to say "BUY OUR SHIT AND IT TOTALLLY SOLVES EVERYTHING!!!!11"

excellent article, very thorough and nuanced explanation.

“It’s worth being honest about…” yeah, no.

Nice!

I'd like to fix the prior abstract. Auth and auth upsets me greatly cos we have:

Authentication & Authorization

and we call both/either auth. Hence please help me make this a thing:

AuthENTIcation & AuthORIzation : ENTI & ORI

ENTI- can you enter, ORI (or ORIZ) what can you do?


This has already been solved well-enough with AuthN and AuthZ as distinct names.

UK is rotating in its decaying royal grave

I'm not opposed to AuthS either! :)

> ENTI- can you enter, ORI (or ORIZ) what can you do?

I don't mean to quarrel about it, but I understood Authentication to be closer to identification. To provide "adequate proof that you are actually who you claim to be".

Even the "can you enter" question falls under authorization; "does the user have appropriate permissions?" Entering is just one of perhaps many subsequent levels of permissions.


I think you've got the right idea, though in practice the initial "authentication" question (you are who you say you are) is very closely linked to the initial "authorization" evaluation (can you enter).... because in most systems the only "can you enter" authorization required for access is in fact that you are who you say you are.

But not all systems work this way. There are some systems where you can log in successfully, but then are immediately escorted out because the "can you enter" question has secondary considerations or is decided once identity has been established based on a larger criteria. Expired accounts in some systems work exactly like this.


Sign in / Sign up is my go to pet peeve for this type of thing

ident and perms

This. It's concise and I don't have to think about "which Auth" we're talking about.

What is missing is a graph of all the data and its relationships. Then its just a matter of grouping things together appropriately for humans to understand.

It's funny how a graph underlies absolutely everything but no one seems to use them.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: