Re: [Txauth] Polymorphism (Was: JSON Schema?)

Dick Hardt <dick.hardt@gmail.com> Wed, 08 July 2020 19:16 UTC

Return-Path: <dick.hardt@gmail.com>
X-Original-To: txauth@ietfa.amsl.com
Delivered-To: txauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id A5A603A07B0 for <txauth@ietfa.amsl.com>; Wed, 8 Jul 2020 12:16:42 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.096
X-Spam-Level:
X-Spam-Status: No, score=-2.096 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_FONT_LOW_CONTRAST=0.001, HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vWyBamx0RRM5 for <txauth@ietfa.amsl.com>; Wed, 8 Jul 2020 12:16:40 -0700 (PDT)
Received: from mail-lj1-x22b.google.com (mail-lj1-x22b.google.com [IPv6:2a00:1450:4864:20::22b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 236413A07C7 for <txauth@ietf.org>; Wed, 8 Jul 2020 12:16:39 -0700 (PDT)
Received: by mail-lj1-x22b.google.com with SMTP id z24so30637268ljn.8 for <txauth@ietf.org>; Wed, 08 Jul 2020 12:16:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=tHneHp04SrN5ZWi9JaHoTgXTkJ5AfrkEXApzY15Eun0=; b=h4y9xfdFwVU3bcuj4hz6pIT2UAgsUzcqg7XdQgEDHS3CPyMVSUQi5gXKHPaKqrZV8f LsAasOoefUk4OYoJWw/pyAJg8shROQvjlXY/0rtB8TVE6c2cpWwOqh3Fj4p60zgToqEU /t05ELKpaX1QjYys3/h5j6ZMsiOdNmfT4Khk90bb4P9F+GzLczMo1zyJwOp2bwe69N+R sMpjN6qapiON0D7LJwl1K479ljOt/9PJFLQ7yekEkaOD9nC3xeDaokP3x2O4Mm548q6w QvUs+iSehw9njvSGtT4NzIFH5C0ah754jAdq8ALeHsfbhMJX4dBzMx6y/xnKZVmlaVSl Y52Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=tHneHp04SrN5ZWi9JaHoTgXTkJ5AfrkEXApzY15Eun0=; b=UeNAT/EPSAd0iIegzCfF13DU8Oheh5Npdir+1j9aXCkJA/1fI92Qb3DnFJLipD7H9L EjTcGss2B8voNKPxiBeanEwa9gpLw5FOnMwWxtLajDK0x6Vo3Tg9HajNSOqiOgoUzjbq oF39ct92nkI6HJTPRwczB17p/uc4PlTqAU0wKoe0aTDl7caO1UAup4NZ/4ZehDuPjOnJ EXi2VdeEb6G0tof+CLQ0t/5c8p9tzcwO8nTE0YSMp4DDt11w0gomSbPMDyYo8/FJZmyL 5sDFttJolHm84S0FRh5G6nTDZlAShxaAi/Q/fwQ7L0MZX794xEK8JcozlOmH1CyiK8iA GjHA==
X-Gm-Message-State: AOAM531RBpxUPiEBU/bqcbc3+/aJp43AJNjQzcpXDHCFnw9fx9wQ8TW/ NNywWHetVCLgUwnguq/qMBfXrWXFzSUWnOAvvhM=
X-Google-Smtp-Source: ABdhPJzTmsjd2KUnPyF5jKV3onSChhjR1kwiCvGXGL60O572btl6aG547Hw8969dHXJfHsDsHBVSrpxETC1LeKgM01I=
X-Received: by 2002:a2e:8316:: with SMTP id a22mr11240163ljh.246.1594235797173; Wed, 08 Jul 2020 12:16:37 -0700 (PDT)
MIME-Version: 1.0
References: <CAD9ie-vnA98pobbboS00SAHneEG52_8eMxh_sE3r3jg6gyooGg@mail.gmail.com> <E9EC90C9-7A9A-4909-8627-A161B33E941F@mit.edu> <CAD9ie-vyB8+5jS=K_qUHfvxsF2wPV5APRo+7WUDfJxNzJONJpg@mail.gmail.com> <8CC8B466-FD6F-4C23-8DAA-99B8A9BDF548@mit.edu> <CAD9ie-u9z7Mc-wNjztoOTy4N_Z9jFDc2Sb6quLspasMGAMKdSw@mail.gmail.com> <097FB93E-96DA-4DF6-8511-0B32FD321211@mit.edu> <CAD9ie-tpuisauOFGiUj65-RcYPtcvW_gZP1CAadqq5cE6P36HQ@mail.gmail.com> <EE4A7D91-1106-44CB-92BF-C3AA3649BDFE@mit.edu>
In-Reply-To: <EE4A7D91-1106-44CB-92BF-C3AA3649BDFE@mit.edu>
From: Dick Hardt <dick.hardt@gmail.com>
Date: Wed, 08 Jul 2020 12:16:00 -0700
Message-ID: <CAD9ie-saoc2FUm46r4h1B27iYK04j_skf5-zJR7EXLmWBzj=hA@mail.gmail.com>
To: Justin Richer <jricher@mit.edu>
Cc: txauth@ietf.org
Content-Type: multipart/alternative; boundary="00000000000060fb5405a9f2f2a0"
Archived-At: <https://mailarchive.ietf.org/arch/msg/txauth/97NIlLlHCTtyNfaiKQC6QmMc_nI>
Subject: Re: [Txauth] Polymorphism (Was: JSON Schema?)
X-BeenThere: txauth@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: <txauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/txauth>, <mailto:txauth-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/txauth/>
List-Post: <mailto:txauth@ietf.org>
List-Help: <mailto:txauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/txauth>, <mailto:txauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 08 Jul 2020 19:16:49 -0000

I think representing the request as an array is simplistic, and complicated
at the same time.

On the simplistic front, as there is no clear mechanism for extending the
request with properties that apply to all of the request.

Using JSON type polymorphism requires the AS to test each member of the
array to determine if it is a string or an object. Only after detecting a
RAR object does the AS know the client is making a RAR request. This also
limits the request to be composed only of scope strings or RAR objects. I
don't see how other strings or objects could be used in the array, so there
is no clear extension point in the "resources" array for other query
mechanisms.

Just as RAR has a "type" property, I propose the "resources"
("authorizations" in XAuth) be an object, where the other properties are
determined by the "type" property. This allows extensions to define new
ways to query for an authorization rather than having to fit into scopes or
RAR.

/Dick



On Wed, Jul 8, 2020 at 10:46 AM Justin Richer <jricher@mit.edu> wrote:

> I’m going to clip the personal attack here on the list and focus on the
> technical discussion, if that’s ok with everyone...
>
>
> wrt. your proposal to represent an authorization request as an array of
> scopes is overly simplistic. Both XYZ and XAuth represent the request as an
> object to enable a request richer than just an array of scopes.
>
>
> I’m not sure why you think it’s overly simplistic: the example I have
> given is valid XYZ syntax that would exist at the root of the client’s
> request. Yes, XYZ *also* allows objects within the same array, to allow
> for richer requests, but it does not require you do that. This is again one
> of the values of doing polymorphism in this particular way. It’s as
> simplistic or as complex as you need it to be, but it’s consistent in its
> model and presentation for both parsing and generation. So let’s take your
> example of “read” and “write” scopes. If a client needs to do this, but
> also needs to do a rich request, it can put them all together like this:
>
> {
>   “resources”: [
>     “read”,
>     “write”,
>     {
>       "type": "payment_initiation",
>       "locations": [
>          "https://example.com/payments"
>       ],
>       "instructedAmount": {
>          "currency": "EUR",
>          "amount": "123.50"
>       },
>       "creditorName": "Merchant123",
>       "creditorAccount": {
>          "iban": "DE02100100109307118603"
>       },
>       "remittanceInformationUnstructured": "Ref Number Merchant"
>    }
>   ]
> }
>
> Notice that the “resources” element is an array here. The first two
> elements of the array are strings — scopes. The third element of the array
> is an object — the multi-dimensional request (this example taken from the
> RAR spec). But it’s always a “list of things that I want”. Some of those
> things are references as strings, some of them are multi-dimensional
> specific rich objects.
>
> This has been in XYZ’s design and implementations for well over a year,
> and it works well. This is also the basis that I’ve used for implementing
> XYZ on top of an old OAuth 2 server, which doesn’t speak RAR or any rich
> requests but knows how to dispatch against scopes.
>
>  — Justin
>
>
> /Dick
>
>
>
> On Wed, Jul 8, 2020 at 7:03 AM Justin Richer <jricher@mit.edu> wrote:
>
>> I’m glad that you’re looking at polymorphism as a possible solution to
>> this, though I would contend that this particular style of polymorphism is
>> not doing much more than pushing the mutual-exclusivity check down a layer
>> instead of solving it.
>>
>> Using multiple types can in fact solve this problem, and several others,
>> as long as you’re willing to let go of the syntax that OAuth 2 invented to
>> solve a problem that we don’t have to solve here (passing an array-type
>> value over the front channel). In XYZ’s syntax, the request for a single
>> access token would look like this:
>>
>> {
>>   “resources”: [ “read”, “write” ]
>> }
>>
>> And the request for the multiple access tokens would look like this:
>>
>> {
>>   “resources": {
>>      “reader": [ “read” ],
>>      “writer”: [ “write” ]
>>   }
>> }
>>
>> I find this to be much simpler to parse and generate, as you no longer
>> need to check for a specially-reserved field name (“type”), and you no
>> longer have to do a sub-parse on one of the values to get what you really
>> want (the space-separated scope string into a set). It’s also a lot simpler
>> for the developers that need to write this.
>>
>>  — Justin
>>
>> On Jul 7, 2020, at 7:30 PM, Dick Hardt <dick.hardt@gmail.com> wrote:
>>
>>
>>
>> On Tue, Jul 7, 2020 at 3:40 AM Justin Richer <jricher@mit.edu> wrote:
>>
>>> I wanted to respond to this comment more fully:
>>>
>>> > wrt. my authorization / authorizations oddness, polymorphism would not
>>> solve it as the contents of both authorization / authorizations in XAuth
>>> are objects.
>>>
>>> It’s not surprising that this is the case, as the XAuth protocol was not
>>> designed with polymorphism as a tool to consider. This is exactly the
>>> reason that I say we should have polymorphism in the toolbox from the
>>> start, as it allows us to avoid this kind of awkwardness in many cases.
>>>
>>
>>  What evidence do you have to make this statement? "XAuth protocol was
>> not designed with polymorphism as a tool to consider"
>>
>> It sounds like you are saying I did not consider polymorphism in the
>> XAuth protocol design.
>>
>> I will restate my comment above about polymorphism.
>>
>> Using different JSON types does not solve the problem, but as I suggest
>> in my comments, polymorphism of different JSON objects is one solution. An
>> authorization, or a dictionary of authorizations. It has the restriction
>> that the string "type" cannot be used as a label in the dictionary. An
>> example:
>>
>> {
>>     "authorizations" {
>>         "type": "oauth_scope",
>>         "scope": "read write"
>>     }
>> }
>>
>> {
>>     "authorizations" {
>>         "reader": {
>>             "type": "oauth_scope",
>>             "scope": "read"
>>         },
>>         "writer": {
>>             "type": "oauth_scope",
>>             "scope": "write"
>>         },
>>     }
>> }
>>
>>
>> I am looking at making this change in XAuth and in the implementation.
>>
>>
>>
>> ᐧ
>>
>>
>>
> ᐧ