Re: [OAUTH-WG] OAuth2 Implementation questions (client secret and refresh tokens)

Dave Rochwerger <daver@quizlet.com> Thu, 08 September 2011 00:06 UTC

Return-Path: <daver@quizlet.com>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 77CD921F87C5 for <oauth@ietfa.amsl.com>; Wed, 7 Sep 2011 17:06:58 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.976
X-Spam-Level:
X-Spam-Status: No, score=-2.976 tagged_above=-999 required=5 tests=[BAYES_00=-2.599, FM_FORGED_GMAIL=0.622, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-1]
Received: from mail.ietf.org ([12.22.58.30]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id R0NQcqEb4pRv for <oauth@ietfa.amsl.com>; Wed, 7 Sep 2011 17:06:57 -0700 (PDT)
Received: from mail-yx0-f172.google.com (mail-yx0-f172.google.com [209.85.213.172]) by ietfa.amsl.com (Postfix) with ESMTP id DAF5B21F8B77 for <oauth@ietf.org>; Wed, 7 Sep 2011 17:06:56 -0700 (PDT)
Received: by yxj20 with SMTP id 20so196900yxj.31 for <oauth@ietf.org>; Wed, 07 Sep 2011 17:08:47 -0700 (PDT)
Received: by 10.151.46.19 with SMTP id y19mr129371ybj.124.1315440527182; Wed, 07 Sep 2011 17:08:47 -0700 (PDT)
Received: from mail-yw0-f44.google.com (mail-yw0-f44.google.com [209.85.213.44]) by mx.google.com with ESMTPS id m3sm758038ybg.11.2011.09.07.17.08.45 (version=SSLv3 cipher=OTHER); Wed, 07 Sep 2011 17:08:46 -0700 (PDT)
Received: by ywe9 with SMTP id 9so191210ywe.31 for <oauth@ietf.org>; Wed, 07 Sep 2011 17:08:45 -0700 (PDT)
Received: by 10.100.230.11 with SMTP id c11mr10104anh.144.1315440525157; Wed, 07 Sep 2011 17:08:45 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.100.164.3 with HTTP; Wed, 7 Sep 2011 17:08:25 -0700 (PDT)
X-Originating-IP: [67.169.69.75]
In-Reply-To: <90C41DD21FB7C64BB94121FBBC2E7234518A4F281D@P3PW5EX1MB01.EX1.SECURESERVER.NET>
References: <CAGyXixwZhMMTzWPrMeWQZEz0v_9WYGwPVByGfPAxGnAthf=3Ng@mail.gmail.com> <CAGyXixzH6uwf72ons1UE2-yKfx=TK-bSBSpN5TzmcJNPVcbxKg@mail.gmail.com> <1315434454.76681.YahooMailNeo@web31816.mail.mud.yahoo.com> <0F38FE37-5F91-48ED-AD9E-1F08B7AA8DA6@oracle.com> <90C41DD21FB7C64BB94121FBBC2E7234518A4F281D@P3PW5EX1MB01.EX1.SECURESERVER.NET>
From: Dave Rochwerger <daver@quizlet.com>
Date: Wed, 07 Sep 2011 17:08:25 -0700
Message-ID: <CAGyXixyEQC0mzuRRrJDM4bN0CeSXA2X_boLbtGuKOCWrFaCZZA@mail.gmail.com>
To: "oauth@ietf.org" <oauth@ietf.org>
Content-Type: multipart/alternative; boundary="00163691febe39a75f04ac62ddab"
Subject: Re: [OAUTH-WG] OAuth2 Implementation questions (client secret and refresh tokens)
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>, <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/oauth>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>, <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 08 Sep 2011 00:06:58 -0000

All our access tokens are currently stateless.

All API calls are going to have to make DB/memcache calls to do anything
interesting anyway, one extra call to check the access token shouldn't have
a drastic effect.
At the very least, we need to lookup/confirm the user exists, so we are
going to make at least a couple of DB/memcache calls on every API request
anyway.

We do use caching, so we could potentially cache access tokens just like
other data we use.


As a (slight) aside, I did have the thought of keeping only refresh tokens
in the DB and using a non-persistant caching layer like memcache to hold
short-lived access tokens (so, in the event of loosing the cache, clients
simply need to refresh and get new access tokens). But even the benefit of
this did not outweigh the cost of the extra complication for 3rd party
developers to have to implement the extra work of handling refresh tokens
and the refresh process.

Dave.

On Wed, Sep 7, 2011 at 4:23 PM, Eran Hammer-Lahav <eran@hueniverse.com>wrote:

> You can revoke access tokens but only if they are Stateful (which usually
> means a DB lookup for every API call which doesn’t scale as well).****
>
> ** **
>
> EHL****
>
> ** **
>
> *From:* oauth-bounces@ietf.org [mailto:oauth-bounces@ietf.org] *On Behalf
> Of *Phillip Hunt
> *Sent:* Wednesday, September 07, 2011 4:24 PM
> *To:* William Mills
> *Cc:* Quizlet Dev Team; oauth@ietf.org
> *Subject:* Re: [OAUTH-WG] OAuth2 Implementation questions (client secret
> and refresh tokens)****
>
> ** **
>
> You can also use a long lived refresh token in combination with a short
> access token. The client is then forced to periodically reauthenticate
> (without the user) before getting a new access token. ****
>
> ** **
>
> Refresh also gives the authzn server a chance to revoke access. Hence it is
> better to use shorter lived access tokens with long lived refresh tokens.
> ****
>
>
> Phil****
>
>
> On 2011-09-07, at 15:27, William Mills <wmills@yahoo-inc.com> wrote:****
>
> I'll talk to the refresh token question:  they give you a hook for
> extensibility and key rotation.  If you want to rotate your encryption keys
> or extend the data carried in the token in any way then you want to be able
> to cleanly refresh your tokens.  Note that the refresh flow allows you to
> issue a new refresh token at the same time.  It also allows a clean path to
> convert tokens in a new client if you decide you want SAML tokens instead of
> MAC for example.****
>
> ** **
>
> If you want those things you want to use refresh tokens.  You can have long
> lived access tokens too, and just use the refresh tokens when you want to do
> something new with the access tokens.****
>
> ** **
>
> -bill****
>
> ** **
> ------------------------------
>
> *From:* Dave Rochwerger <daver@quizlet.com>
> *To:* oauth@ietf.org
> *Cc:* Quizlet Dev Team <devteam@quizlet.com>
> *Sent:* Wednesday, September 7, 2011 2:15 PM
> *Subject:* [OAUTH-WG] OAuth2 Implementation questions (client secret and
> refresh tokens)****
>
> Hi all,****
>
> ** **
>
> I have been implementing OAuth2 based on the various drafts for our new
> API. Initially, I implemented everything as per the spec, but due to our
> particular scenario and restrictions we have in place, there are some
> fundamental questions that I am unable to defend.****
>
> ** **
>
> I am hoping this group could help answer them for me.****
>
> ** **
>
> Our scenario:****
>
> ==========
> * We are implementing an API to allow 3rd party developers to access users'
> protected resources via their applications. The applications will mostly be
> native phone apps, but some will have web server backends (javascript-only
> applications are not a concern at the moment).****
>
> * We want to provide very long-lived (forever) tokens.****
>
> * We are implementing the "authorization code" flow as that seems best
> suited to us (we don't want the implicit flow because end-users would have
> to re-authorize every hour).****
>
> ** **
>
> Our architecture:****
>
> ============****
>
> * We control both the API server and the authorization server.****
>
> * All requests to protected resources (ie: to the API server) are always
> done over SSL.****
>
> * All requests to the authz server (token and authorize endpoints) are
> always done over SSL.****
>
> * We enforce that every client must supply the state parameter (and our
> guidelines say they must verify the state for CSRF mitigation).****
>
> * We enforce that every client must register a redirect URI.****
>
> * We validate the redirect_uri used to request an access token is the same
> that was used to obtain the auth code.****
>
> * The only time a request is not made over SSL is the redirect with the
> auth_code which is very short-lived (30 seconds) and is tied to a verified
> redirect URI.****
>
> * We enforce that access tokens must be provided using the Authorization
> header only (and of course, over SSL).****
>
> * We have guidelines saying that all mobile apps must use the native
> browser (and not an embedded web UI).****
>
> ** **
>
> Questions:****
>
> ========****
>
> 1. Given the above scenario, what use are refresh tokens?****
>
>   - Access tokens can not leak because every request (to resource and authz
> server) containing an access token is done over SSL. We control both the
> authz and resource servers, so tokens in logs (and other suggested reasons
> in the archives) are not an issue.****
>
>   - Long-lived refresh tokens and short-lived access tokens are supposed to
> provide security due to possible access token leakage... but in our 100%
> SSL scenario, if access tokens are able to leak, then so would the client
> id, secret and refresh token.****
>
>   - Having a long-lived refresh token that can be exchanged for another
> access token adds a level of complexity (a second HTTPS request every so
> often) and seems to provide no benefit for our case.****
>
> ** **
>
> ** **
>
> 2. What is the point of the client secret (in our scenario)? ****
>
> - We originally were treating the clients as confidential, but after
> re-reading the native-application section, it seems we really should treat
> them as public (phone apps can be decompiled and the secret discovered).**
> **
>
> - The spec says that the authz server should
> authenticate confidential clients, but public clients are allowed to just
> send their public client id (and no secret).****
>
> - The only verification then, is to enforce redirect URI registration and
> to validate the redirect URI between authorization and token steps.****
>
> ** **
>
> So, the question is, assuming that we, one: "enforce redirect-URI
> registration" and two: "validate that URI" - why can't we treat all clients
> as public and not worry about a secret?****
>
> What is the benefit of having confidential clients (and a secret) at all?
> ****
>
> ** **
>
> ** **
>
> Our API source is not available, but the oauth2 server implementation can
> be seen here: https://github.com/quizlet/oauth2-php****
>
> ** **
>
> Regards,****
>
> Dave****
>
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>
> ****
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth****
>
>