Hi George,
if you want to effectively preseve the refresh token, why doesn't the AS just
treat the new client id as an alias of the the old client id?
regards,
Torsten.
-------- Ursprüngliche Nachricht --------
Von: George Fletcher <[email protected]>
Datum:03.04.2014 15:43 (GMT+01:00)
An: Torsten Lodderstedt <[email protected]>,Phil Hunt
<[email protected]>
Cc: OAuth WG <[email protected]>
Betreff: Re: [OAUTH-WG] Handling stored tokens in mobile app after software
update with client credential change
Hi Torsten,
We actually have the same issue. Deployed clients in the field where we want to update
the client_id and doing so invalidates the existing refresh_token stored with the client.
From a user experience perspective, this is a pain and from a risk perspective I think
it's fine to effectively do a "token exchange" from the old refresh_token to
the new one (with the appropriate security considerations in mind).
Andre got me thinking about this and here is what I'm leaning towards
implementing in our system.
Use the JWT Client Assertion flow requesting an authorization grant for the existing user. The JWT would contain an
"iss" of the new client_id, a "sub" of the userid the client should already know about, an
"aud" of the Authorization Server, a short lived "exp" value as this is effectively a one-time
token exchange, and an additional claim of the old refresh_token. Maybe an additional claim with the old client_id as
well (still thinking about that as the client_id is already associated with the refresh_token).
This allows the AS to do the following checks...
1. Make sure the assertion is being presented by the new client (the level of
surety is based on the risk associated with the client. If the client is
provisioned with additional keys some how that's much stronger than just using
a client_secret which, as you point out, doesn't really prove anything).
2. Verify that the "sub" value in the JWT is the same as that identified by the
refresh_token
3. Verify that the client_id defined as the "issuer" is allowed to make this
token exchange call and that the client_id in the refresh_token is one of those being
replaced
4. Verify the audience of the JWT
If all the checks pass, then a new refresh_token can be issued, with exactly the same scopes as the
"old" refresh_token (no ability in this flow to change scopes). The semantics of the
refresh_token (e.g. authN time, expiry time, etc) need to be copied to the new refresh_token. In
other words there should be no way to "extend" the lifetime of the refresh_token via this
mechanism. It's purely a token exchange to provide a new refresh_token mapped to the new client_id.
Interested in feedback as to the viability of this.
Phil, I agree this doesn't need to be standardized, and I would like to see the community
start collecting some "best practices" to help others that come across the same
use case. It will ensure a more secure internet for all of us.
Thanks,
George
On 4/3/14, 6:13 AM, Torsten Lodderstedt wrote:
Hi Andre,
I would expect the AS to treat a client with a different client id as another client. So
the new client should not be able to use the "old" refresh tokens.
Some further questions/remarks:
- if you utilize refresh tokens, access tokens should be transient. Right? So
you don't need to bother
- public client means w/o secret - there is no security benefit of having a
secret for the type of client you described (see Spec section 10)
Regards,
Torsten.
Am 03.04.2014 um 00:51 schrieb Phil Hunt <[email protected]>:
I don't see a strong reason to standardize behaviour here. But it seems like a
change in scope after a client upgrade is a good reason to expire existing
tokens and re-authorize as well as simply expire tokens.
Some may choose to be very conservative and always expire tokens on any client update.
But I think that unless there is a critical security due to the nature of the client
and/or server, there is no reason to assume it is necessary beyond "good
practice".
One good reason for expiring tokens is that you are forcing the client to
re-confirm it has the new client credential and it is still valid.
If you revoke tokens and refresh tokens, your authorization and authentication
system might inspect browser cookies that hold the previous SSO state and/or
previous authorization state. Thus you could avoid re-authenticating the user
and simply ask about the new scopes.
Phil
@independentid
www.independentid.com
[email protected]
On Apr 2, 2014, at 1:37 PM, André DeMarre <[email protected]> wrote:
We have a mobile app which operates as an OAuth 2.0 public client
(w/client credentials). It uses the resource owner password
credentials grant type for authorized communication with our resource
servers.
We are working on a software update and want to change the registered
client_id and client_secret for the new app version (register a new
client at the auth server). The problem is that after the app updates
on users' devices, it will inherit the app data of the previous
version, including the access and refresh tokens.
Since the token scope issued to the new client might be different, we
know that we want the new app version to discard the previous
version's access tokens. But what about the refresh token?
Technically, the new version of the app will be a different client,
but the core OAuth spec section 6 says "the refresh token is bound to
the client to which it was issued." So what should we do?
We can program the app to discard the previous version's refresh
token, but that would inconvenience our users to re-enter their
password after the software update.
I'm tempted to allow the new client to use the refresh token issued to
the previous client, but that violates the spec.
Does the OAuth community have any insight here? Thank you.
Kind Regards,
Andre DeMarre
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
Hi George,
if you want to effectively preseve the refresh token, why doesn't the
AS just treat the new client id as an alias of the the old client id?
regards,
Torsten.
-------- Ursprüngliche Nachricht --------
Von: George Fletcher
Datum:03.04.2014 15:43 (GMT+01:00)
An: Torsten Lodderstedt ,Phil Hunt
Cc: OAuth WG
Betreff: Re: [OAUTH-WG] Handling stored tokens in mobile app after
software update with client credential change
Hi Torsten,
We actually have the same issue. Deployed clients in the field where
we want to update the client_id and doing so invalidates the existing
refresh_token stored with the client. From a user experience
perspective, this is a pain and from a risk perspective I think it's
fine to effectively do a "token exchange" from the old refresh_token
to the new one (with the appropriate security considerations in mind).
Andre got me thinking about this and here is what I'm leaning towards
implementing in our system.
Use the JWT Client Assertion flow requesting an authorization grant
for the existing user. The JWT would contain an "iss" of the new
client_id, a "sub" of the userid the client should already know about,
an "aud" of the Authorization Server, a short lived "exp" value as
this is effectively a one-time token exchange, and an additional claim
of the old refresh_token. Maybe an additional claim with the old
client_id as well (still thinking about that as the client_id is
already associated with the refresh_token).
This allows the AS to do the following checks...
1. Make sure the assertion is being presented by the new client (the
level of surety is based on the risk associated with the client. If
the client is provisioned with additional keys some how that's much
stronger than just using a client_secret which, as you point out,
doesn't really prove anything).
2. Verify that the "sub" value in the JWT is the same as that
identified by the refresh_token
3. Verify that the client_id defined as the "issuer" is allowed to
make this token exchange call and that the client_id in the
refresh_token is one of those being replaced
4. Verify the audience of the JWT
If all the checks pass, then a new refresh_token can be issued, with
exactly the same scopes as the "old" refresh_token (no ability in this
flow to change scopes). The semantics of the refresh_token (e.g. authN
time, expiry time, etc) need to be copied to the new refresh_token. In
other words there should be no way to "extend" the lifetime of the
refresh_token via this mechanism. It's purely a token exchange to
provide a new refresh_token mapped to the new client_id.
Interested in feedback as to the viability of this.
Phil, I agree this doesn't need to be standardized, and I would like
to see the community start collecting some "best practices" to help
others that come across the same use case. It will ensure a more
secure internet for all of us.
Thanks,
George
On 4/3/14, 6:13 AM, Torsten Lodderstedt wrote:
Hi Andre,
I would expect the AS to treat a client with a different client id as another client. So
the new client should not be able to use the "old" refresh tokens.
Some further questions/remarks:
- if you utilize refresh tokens, access tokens should be transient. Right? So
you don't need to bother
- public client means w/o secret - there is no security benefit of having a
secret for the type of client you described (see Spec section 10)
Regards,
Torsten.
Am 03.04.2014 um 00:51 schrieb Phil Hunt<[email protected]>:
I don't see a strong reason to standardize behaviour here. But it seems like a
change in scope after a client upgrade is a good reason to expire existing
tokens and re-authorize as well as simply expire tokens.
Some may choose to be very conservative and always expire tokens on any client update.
But I think that unless there is a critical security due to the nature of the client
and/or server, there is no reason to assume it is necessary beyond "good
practice".
One good reason for expiring tokens is that you are forcing the client to
re-confirm it has the new client credential and it is still valid.
If you revoke tokens and refresh tokens, your authorization and authentication
system might inspect browser cookies that hold the previous SSO state and/or
previous authorization state. Thus you could avoid re-authenticating the user
and simply ask about the new scopes.
Phil
@independentid
www.independentid.com
[email protected]
On Apr 2, 2014, at 1:37 PM, André DeMarre<[email protected]> wrote:
We have a mobile app which operates as an OAuth 2.0 public client
(w/client credentials). It uses the resource owner password
credentials grant type for authorized communication with our resource
servers.
We are working on a software update and want to change the registered
client_id and client_secret for the new app version (register a new
client at the auth server). The problem is that after the app updates
on users' devices, it will inherit the app data of the previous
version, including the access and refresh tokens.
Since the token scope issued to the new client might be different, we
know that we want the new app version to discard the previous
version's access tokens. But what about the refresh token?
Technically, the new version of the app will be a different client,
but the core OAuth spec section 6 says "the refresh token is bound to
the client to which it was issued." So what should we do?
We can program the app to discard the previous version's refresh
token, but that would inconvenience our users to re-enter their
password after the software update.
I'm tempted to allow the new client to use the refresh token issued to
the previous client, but that violates the spec.
Does the OAuth community have any insight here? Thank you.
Kind Regards,
Andre DeMarre
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth
--
George Fletcher <http://connect.me/gffletch>
_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth