this post was submitted on 21 Aug 2023
11 points (100.0% liked)

Programming

17129 readers
346 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 1 year ago
MODERATORS
 

I have an implementation for an internal API, the requirement is to implement some sort of basic authentication instead of oauth (generating a token).

Do you think there's any difference between using just an API key vs using a client id + secret?
For what I see it'd be just like saying "using a password" vs "using a user and a password".

top 8 comments
sorted by: hot top controversial new old
[–] kevincox@lemmy.ml 4 points 1 year ago (1 children)

The difference is that you can have multiple API keys for the same account.

  1. You can revoke API keys from a lost device without changing your password.
  2. You can grant a different service a restricted API key for limited access.
  3. API keys can expire, forcing password expiry is very use unfriendly.

The password is the "root secret" of the account. It is (mostly) unrevokable and doesn't expire. It is a huge risk to have the password lying around. So it is better to quickly exchange the password for a less risky token, then you can wipe the password. Then all clients don't need to store the password. The user just needs to provide it once then lower-value secrets can be used for future authentication.

[–] pe1uca@lemmy.pe1uca.dev 1 points 1 year ago (1 children)

I don't fully understand what use case you're thinking about.
An API key which expires is very hard to work with, imagine deploying an app with that kind of key, or a service/bot which uses that key.

Maybe you're thinking about access tokens, which need to be regenerated every so often and can be generated with a refresh token.

[–] kevincox@lemmy.ml 1 points 1 year ago

API tokens don't need to expire. But having them expire is a nice security benefit. It means that eventually they will be useless even if they are sitting around on an old laptop that gets thrown away.

For many use cases this works well. For example a client app can easily refresh the token from time-to-time. This can be managed with an access/refresh token system (which has the advantage that the token you are frequently sending over the wire doesn't have refresh capabilities)

[–] hallettj@beehaw.org 2 points 1 year ago

For what I see it'd be just like saying "using a password" vs "using a user and a password".

As long as API keys have more entropy than typical username & password combinations they can be more secure. Imagine if you had a system where you make a token by concatenating username and password - the security properties don't change just because you're exchanging one string instead of two separate ones.

[–] redcalcium@lemmy.institute 1 points 1 year ago

It's fine as long as the key/secret is never transmitted in clear text (always encrypted e.g. with https) and never exposed to the end users to prevent credential leak. What matter is if you can rotate those keys quickly enough when there is a security incident. oauth has advantage here because the token has expiry date so if you happen to have a leak, at least the leaked token won't work indefinitely.

[–] ck_@discuss.tchncs.de 0 points 1 year ago (1 children)

There is no difference security wise. The benefit of the clientid is mainly that it is shared cleartext information, so it can be used in eg. support requests, password recovery, what have you.

[–] pe1uca@lemmy.pe1uca.dev 0 points 1 year ago (1 children)

You got me thinking in something more, are API keys stored in plain text in DB? Otherwise I don't see a way to quickly know it's valid, I'd have to validate it against all the hashes in the DB.
With client id it'd be easy to just validate the secret against a single hash for that user.

[–] ck_@discuss.tchncs.de 2 points 1 year ago

Its never really a good approach to store secrets in plain text. I don't see how that would be more expensive for your database than validating clientId + secret.