Hi Dave,

there has been a long debate about native client security and you can also find a comprehensive analysis in the security document.

It's just a fact that such clients cannot reliably be authenticated in a public environment (even if malicious clients can be detected in some cases). So it is the responsibility of the resource owner to validate the authenticity/trustworthiness of an app before using it. The authz server's task is to authz access to cloud resources, so it asks the resource owner for consent. Once the consent is given, the refresh token itself represents the fact that the holder should be a legitimate client.

regards,
Torsten.
------------------------------------------------------------------------
*From: * Dave Rochwerger <da...@quizlet.com>
*Date: *Wed, 14 Sep 2011 13:45:42 -0700
*To: *Torsten Lodderstedt<tors...@lodderstedt.net>
*Cc: *<oauth@ietf.org>
*Subject: *Re: [OAUTH-WG] OAuth2 Implementation questions (client secret and refresh tokens)

Is this a security issue in the OAuth2 process then (for mobile apps using the authorization code flow)?

1. The draft says that mobile apps should be considered public clients because mobile apps can be decompiled and can not keep their credentials private. 2. In this case then, the draft says for these mobile apps to not authenticate with the secret and instead for the server to verify the redirect URI (and make it mandatory). 3. You said that verifying the redirect URI is not good enough to verify the client's identity.

What am I missing?

Thanks,
Dave


On Wed, Sep 14, 2011 at 12:51 PM, Torsten Lodderstedt <tors...@lodderstedt.net <mailto:tors...@lodderstedt.net>> wrote:

   Hi Dave,

   redirect URI validation does not authenticate a client. For example,
   a URI registered for a private web client could be used by a
   (malicious) native app to assume the web app's identity. The client
   secret, in contrast, can be used to authenticate it.

   regards,
   Torsten.

   Am 14.09.2011 19:12, schrieb Dave Rochwerger:

       Thanks for the follow up, Torsten.

       Whilst I have your attention - any thoughts on my second question,
       about the use of a client secret?
       If for all clients we mandated registered URIs and verified them
       (whether they are private and public), what additional security does
       the client secret actually provide for private clients in the
       authorization code flow?


       Thanks,
       Dave

       On Wed, Sep 14, 2011 at 7:20 AM, Torsten Lodderstedt
       <tors...@lodderstedt.net <mailto:tors...@lodderstedt.net>>  wrote:

           Hi Dave,


           On Wed, 7 Sep 2011 17:22:14 -0700, Dave Rochwerger wrote:

               1. "The user does not have to be present."
               Maybe I should be more clear. What benefit does that
               have over just a
               long-lived (forever) access token? The cost is the extra
               complication for
               3rd party developers to have to worry about refresh
               tokens. I can not see
               a benefit in our model (everything over SSL, etc) to use
               refresh tokens.
               I want to use refresh tokens - but only if there is a
               reason for them,
               which I can not see at the moment.


           The benefit of refresh tokens significantly depends on your
           access token design. If your access tokens are just a
           pointer to a database you lookup on any API call, the only
           benefit if token rotation (coming back to this topic below).
           But your access tokens could also directly contain all user
           data you need to actually authorize API access. That way you
           could save DB lookups, which scales much better. In this
           model, revocation is much can be easier implement using
           refresh tokens. I think this is what Eran refered to.


               2. "As Eran points out, you'd have to have do a DB
               lookup to have true
               revocation."
               The act of revoking tokens is not a common occurrence,
               DB lookups to
               revoke tokens is not a concern as there is more time
               spent by the user
               navigating the UI (or network latency, etc) than the
               cost of the DB call.

               3. "In this sense you get the best of a long-lived
               credential, combined
               with good key rotation and authorization re-verification
               without having
               to re-involve the end-user."
               That all sounds good, but in our situation (all SSL,
               etc) - what do we
               want key rotation and re-verification for? I fail to see
               a reasonable
               vector for access token leakage to warrant any of this
               in our case.


           rotation is a mean to detect tokem theft from the device
           (see also
           
http://tools.ietf.org/html/draft-lodderstedt-oauth-security-01#section-4.1.2).

           regards,
           Torsten.

               On Wed, Sep 7, 2011 at 5:08 PM, Phil Hunt wrote:

                   See below...

                   Phil
                   @independentid
                   www.independentid.com <http://www.independentid.com>
                   [11] phil.h...@oracle.com
                   <mailto:phil.h...@oracle.com> [12]


                   On 2011-09-07, at 4:57 PM, Dave Rochwerger wrote:

                       Hi Phil,>>  The client is then forced to
                       periodically reauthenticate
                       (without the user) before getting a new access
                       token.
                       What benefit does that have?

                   The user does not have to be present.

                               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.
                       That doesn't follow - we can just as easily
                       revoke the single
                       long-lived access token.

                   As Eran points out, you'd have to have do a DB
                   lookup to have true
                   revocation. But, by having a short expiration time
                   on the access token
                   (say 1 hour or less), you get quasi-revocation which
                   has to be
                   re-validated after the access token expires and the
                   client has to
                   re-authenticate and provide a valid refresh token.
                   In this sense you
                   get the best of a long-lived credential, combined
                   with good key
                   rotation and authorization re-verification without
                   having to re-involve
                   the end-user.

                   Dave.>

                       On Wed, Sep 7, 2011 at 4:24 PM, Phillip Hunt wrote:

                           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 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
                               TO: oauth@ietf.org
                               <mailto:oauth@ietf.org> [2]
                               CC: Quizlet Dev Team
                               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 [4]

                               Regards,
                               Dave

                               _______________________________________________
                               OAuth mailing list
                               OAuth@ietf.org <mailto:OAuth@ietf.org> [5]
                               https://www.ietf.org/mailman/listinfo/oauth
                               [6]


                               _______________________________________________
                               OAuth mailing list
                               OAuth@ietf.org <mailto:OAuth@ietf.org> [7]
                               https://www.ietf.org/mailman/listinfo/oauth
                               [8]




           Links:
           ------
           [1] mailto:da...@quizlet.com <mailto:da...@quizlet.com>
           [2] mailto:oauth@ietf.org <mailto:oauth@ietf.org>
           [3] mailto:devt...@quizlet.com <mailto:devt...@quizlet.com>
           [4] https://github.com/quizlet/oauth2-php
           [5] mailto:OAuth@ietf.org <mailto:OAuth@ietf.org>
           [6] https://www.ietf.org/mailman/listinfo/oauth
           [7] mailto:OAuth@ietf.org <mailto:OAuth@ietf.org>
           [8] https://www.ietf.org/mailman/listinfo/oauth
           [9] mailto:wmi...@yahoo-inc.com <mailto:wmi...@yahoo-inc.com>
           [10] mailto:phil.h...@oracle.com <mailto:phil.h...@oracle.com>
           [11] http://www.independentid.com
           [12] mailto:phil.h...@oracle.com <mailto:phil.h...@oracle.com>
           [13] mailto:phil.h...@oracle.com <mailto:phil.h...@oracle.com>

           _______________________________________________
           OAuth mailing list
           OAuth@ietf.org <mailto:OAuth@ietf.org>
           https://www.ietf.org/mailman/listinfo/oauth


_______________________________________________
OAuth mailing list
OAuth@ietf.org
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to