From sachinmamoru@gmail.com  Wed Feb 21 01:37:42 2024
Return-Path: <sachinmamoru@gmail.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 A8756C14F749
 for <oauth@ietfa.amsl.com>; Wed, 21 Feb 2024 01:37:42 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.084
X-Spam-Level: 
X-Spam-Status: No, score=-2.084 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_MESSAGE=0.001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001,
 SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_KAM_HTML_FONT_INVALID=0.01,
 T_REMOTE_IMAGE=0.01, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001,
 URIBL_DBL_BLOCKED_OPENDNS=0.001, URIBL_ZEN_BLOCKED_OPENDNS=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 ([50.223.129.194])
 by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id 6rASBqie7pXi for <oauth@ietfa.amsl.com>;
 Wed, 21 Feb 2024 01:37:38 -0800 (PST)
Received: from mail-yw1-x1130.google.com (mail-yw1-x1130.google.com
 [IPv6:2607:f8b0:4864:20::1130])
 (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256)
 (No client certificate requested)
 by ietfa.amsl.com (Postfix) with ESMTPS id E32D6C14F726
 for <oauth@ietf.org>; Wed, 21 Feb 2024 01:37:37 -0800 (PST)
Received: by mail-yw1-x1130.google.com with SMTP id
 00721157ae682-608342633b8so33898407b3.1
 for <oauth@ietf.org>; Wed, 21 Feb 2024 01:37:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1708508257; x=1709113057; darn=ietf.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=hosdO4vSuk3i4pb/iw1pKQVqbn80GGxyJ6j0uGMfJLc=;
 b=kUQfgXFLa3az/QTs1QfhuDuvt4LGh8Fy+lJrtCo6pyH7cwV9e15XwJxaC8J6UsjLpz
 sGAdzpSSpHA23tHOZN85HtX8CfKECs5U0bMrNOjVKwM+anbI33q72CzAgeEowd7ghHiL
 pcrePqW4SmeV1p9Q9VYqXqTPdK4OzCGF8T/Jv6s7COFk8iOOKS3xKAAlD6pKCniEbcJg
 aBvWBgTUT4nQPF6weadVbZrqSNpGi/lif+IlbYDURY6HDG3xTLcbZL0IrQMqcKFZ6Y1/
 Ng4gLVI0+xucP3To1YxinnFXBaME6oT3LHzznlwnjkiqkmmK/VP0zehggTgWjbpwdkjx
 HC6g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1708508257; x=1709113057;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=hosdO4vSuk3i4pb/iw1pKQVqbn80GGxyJ6j0uGMfJLc=;
 b=xJM8oP9VFgvnlxkJMPVWleryKQ4MCyic2jJllOhJydM7bJkP0NqTMV6tkZ2gBlWvIM
 yVzk7aM67Ow20hg45aWi6HCCu5Vwe8yBh2MXbxdi3pyR2jk3nbTqoIupL2r+q7y+AQH+
 5jSHoX04eaGbuq0SIo1SCmBtlv1HigfXrL57rFqe2RgXcLEnOZUJvlcvNhd/PSwy/vD1
 FzVuoxg4/CF1zmYVfCYjUCLNQO9aEO6JG4Yw0ZmfkTBilC8RQ+PeJt6d1iBYJNW1wOZ1
 HHpWabu5ftbT3d6P+WE9hYfxFR7YOaCwd7h1bXdPvN8KI7EZiBjx2li8WQ3HWbXrLwS9
 ZiCQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCWay6QZfSH9eHq/XgIPABH7gDG9W7O1Zhd18jZMlp2ryaIr/rFySD9s/iSKgSV7C4QJFNOwIHik282dIMRThA==
X-Gm-Message-State: AOJu0YxgN7KmTk/Lu7ApvW2qtfBjGZzrfdimY4VGZm7n8K4cOR4v6DFy
 YY+8U+9CUSjP1TWksZjfm8dGqOv58YNv/zH2SYxXgTmie7d+Z+l1Y5pZqNBa5uZqgG4ES6C3vRP
 Ig3XXp2TzjXX6ChCel+fUMgoAweQ=
X-Google-Smtp-Source: AGHT+IH4cWzLMH94fbkn4tvetquBDILK/cThcYuDHi+NDEnnURv2vPbaZ5oMg39bj8jkI9T+EDsv/IplkF2fUW9nCxg=
X-Received: by 2002:a81:9bd6:0:b0:604:9c75:626f with SMTP id
 s205-20020a819bd6000000b006049c75626fmr18082054ywg.46.1708508256831; Wed, 21
 Feb 2024 01:37:36 -0800 (PST)
MIME-Version: 1.0
References: <CAD=XBCog_o8GzpDMTYKvvi=2mneM0nW0vfCc=FubtOFNF5WM=A@mail.gmail.com>
 <374ADB2C-2F74-4B95-8CDA-3266089CD00C@gmail.com>
 <CAD=XBCqs-Qf7P--KvqQcJq37Agh3gn-bfwfj7tZvwdngx+4k+A@mail.gmail.com>
 <13C59DD4-94E0-47AC-9A7E-D7B463BD1552@gmail.com>
 <CAD=XBCpgLZObed8Kj2ST6engpFR47psFrrbNKw5rwaN=_E25qA@mail.gmail.com>
 <CAD=XBCrkFr3L2AyXtKRPSAmHg9khQctENZ-2+oR1af7JBbcJ-g@mail.gmail.com>
 <11F9493F-CE30-450F-BDC9-3C8DCAC35B28@gmail.com>
In-Reply-To: <11F9493F-CE30-450F-BDC9-3C8DCAC35B28@gmail.com>
From: Sachin Mamoru <sachinmamoru@gmail.com>
Date: Wed, 21 Feb 2024 15:07:24 +0530
Message-ID: <CAD=XBCq8Q2a9yxEbotJ2wepjy+BzeoN0=f8x_RpBV1LgtBX58A@mail.gmail.com>
To: Neil Madden <neil.e.madden@gmail.com>
Cc: wparad@rhosys.ch, oauth <oauth@ietf.org>, janak@wso2.com, 
 thilinasenarath97@gmail.com, "piraveena@wso2.com" <piraveena@wso2.com>
Content-Type: multipart/alternative; boundary="000000000000be8ccb0611e1138c"
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/DG29draWNvewc6r74gZdv9OLPXk>
Subject: Re: [OAUTH-WG] Evaluation of Scope Management in Refresh Token
 Behavior
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.39
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: <https://mailarchive.ietf.org/arch/browse/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: Wed, 21 Feb 2024 09:37:42 -0000

--000000000000be8ccb0611e1138c
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi Neil,

Since Access tokens are bound to scopes. These scopes define the
permissions granted for accessing resources. When an access token is
requested, it's issued with specific scopes based on the authorization
granted by the resource owner.

On the other hand, Refresh tokens are used to obtain new access tokens when
the current access token expires or becomes invalid. The critical aspect
here is that the refresh token itself is not bound by scopes in the same
way access tokens are. Instead, the refresh token carries the potential to
issue new access tokens with scopes that are the same as or narrower than
the original scopes granted during the initial authorization process.

When you use a refresh token to obtain a new access token, you have the
option to request a scope that is narrower than the original scope.

This is quite contradicting to me as the spec says that "refresh token
scopes should be identical to that of the refresh token included by the
client in the request". - When a refresh token is used to obtain a new
access token, and a new refresh token is also issued in this process, the
new refresh token must have the same scope as the refresh token that was
used in the request.
On the other hand, it says "Refresh tokens are issued to the client by the
authorization server and are used to obtain a new access token when the
current access token becomes invalid or expires, or to obtain additional
access tokens with identical or narrower scope". - There's a flexibility in
scope when using a refresh token to request new access tokens, but this
flexibility might seem counterintuitive at first. Specifically, the idea
that the scope of the new access token can be adjusted (narrowed) without
altering the permissions granted by the refresh token itself.

Thanks & Regards,
Sachin

On Wed, 21 Feb 2024 at 13:57, Neil Madden <neil.e.madden@gmail.com> wrote:

> That section quite clearly says "*access tokens* with identical or
> narrower scope". Not refresh tokens.
>
> -- Neil
>
> On 21 Feb 2024, at 08:24, Sachin Mamoru <sachinmamoru@gmail.com> wrote:
>
> Hi Warren and Neil,
>
> My basis for asking this is due to the following definition [1],
>
> Refresh tokens are credentials used to obtain access tokens.  Refresh
>    tokens are issued to the client by the authorization server and are
>    used to obtain a new access token when the current access token
>    becomes invalid or expires, or to obtain additional access tokens
>    with identical or narrower scope (access tokens may have a shorter
>    lifetime and fewer permissions than authorized by the resource
>    owner).  Issuing a refresh token is optional at the discretion of the
>    authorization server.  If the authorization server issues a refresh
>    token, it is included when issuing an access token (i.e., step (D) in
>    Figure 1).
>
> [1] https://datatracker.ietf.org/doc/html/rfc6749#section-1.5
>
> Thanks & Regards,
> Sachin
>
> On Wed, 21 Feb 2024 at 13:36, Sachin Mamoru <sachinmamoru@gmail.com>
> wrote:
>
>> Hi Warren and Neil,
>>
>> Thanks for the valuable input and sorry for mentioning other products, I
>> just wanted to provide an example.
>> So Warren according to you following is the behaviour that spec suggeste=
d.
>>
>> When we request an access token using 3 scopes (scope1, scope2, scope3).
>>
>> Then will receive a refresh token (refresh_token1) with the access token=
.
>>
>> After that will request another access token with refresh_token1 and
>> provide the scope list as scope1 and scope2 (Narrow down scopes).
>>
>> Similarly, get another refresh token (refresh_token2) with the access
>> token.
>>
>> Now if we request another access token with refresh_token2, we should be
>> able to request scope3 also.
>> That means the refresh token will not be narrowed down instead only the
>> access token will get narrowed down.
>>
>> So Warren and Neil, if possible can you pinpoint to me the exact place i=
n
>> the spec where it does explicitly say that the refresh token should not =
be
>> narrowed down based on the given scopes?
>>
>> Thanks & Regards,
>> Sachin
>>
>> On Wed, 21 Feb 2024 at 01:12, Neil Madden <neil.e.madden@gmail.com>
>> wrote:
>>
>>> It sounds like they are violating the spec then. On the other hand, the
>>> fact that the scope can be "increased back to the original scope" maybe
>>> suggests the effective scope of the refresh token is still the same? Ei=
ther
>>> way, the spec is pretty clear, regardless of what some vendor does.
>>>
>>> -- Neil
>>>
>>> On 20 Feb 2024, at 19:26, Sachin Mamoru <sachinmamoru@gmail.com> wrote:
>>>
>>> Hi Neil,
>>>
>>> Thanks for the clarification.
>>> But Curity has a different approach and they implemented it according t=
o
>>> the concept of narrowing down the refresh token scopes.
>>>
>>> "The scope was originally read openid profile and after refresh the
>>> access was reduced to read profile (i.e., the access_token now only has=
 read
>>> profile scope and any new tokens obtained using the refresh token
>>> daa38700-ba96-4ef1-8b30-5cb3527aae19 will have the same, reduced
>>> scope). Note that *increasing* the scope of access cannot be done in
>>> this way unless first reduced and increased back to the original scope.=
"
>>>
>>> [1]
>>> https://curity.io/resources/learn/refresh-tokens/#changing-scope-of-acc=
ess-token-on-refresh
>>>
>>> Thanks & Regards,
>>> Sachin
>>>
>>> On Tue, 20 Feb 2024 at 21:59, Neil Madden <neil.e.madden@gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On 20 Feb 2024, at 11:02, Sachin Mamoru <sachinmamoru@gmail.com> wrote=
:
>>>>
>>>> =EF=BB=BF
>>>> Hi Neil,
>>>>
>>>> Does that mean it should be identical to the narrowed scope request or
>>>> the original request scope?
>>>>
>>>>
>>>> It says it has to be identical to the scope of the existing refresh
>>>> token in the request, not the scope specified in the request. So
>>>> effectively you can never downscope a refresh token in this way. Whate=
ver
>>>> scope you specify, any RT returned must always retain the original sco=
pe.
>>>>
>>>> (There are other ways to downscope a RT, eg ForgeRock=E2=80=99s macaro=
ons allow
>>>> you to attenuate the scope if you wish).
>>>>
>>>> =E2=80=94 Neil
>>>>
>>>>
>>>> On Tue, 20 Feb 2024 at 16:31, Sachin Mamoru <sachinmamoru@gmail.com>
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Tue, 20 Feb 2024 at 12:23, Neil Madden <neil.e.madden@gmail.com>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>> On 20 Feb 2024, at 06:44, Sachin Mamoru <sachinmamoru@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>> =EF=BB=BF
>>>>>> Hi All,
>>>>>>
>>>>>> When we request an access token using 3 scopes (scope1, scope2,
>>>>>> scope3).
>>>>>> Then will receive a refresh token (refresh_token1) with the access
>>>>>> token.
>>>>>>
>>>>>> After that will request another access token with refresh_token1 and
>>>>>> provide the scope list as scope1 and scope2 (Narrow down scopes).
>>>>>> Similarly, get another refresh token (refresh_token2) with the acces=
s
>>>>>> token.
>>>>>>
>>>>>> Now if we request another access token with refresh_token2, we canno=
t
>>>>>> request scope3, instead, we can either request both scope1 and scope=
2 or
>>>>>> one of them.
>>>>>>
>>>>>> But in the specification, didn't able to find anything related to
>>>>>> narrow-down scopes with refresh token.
>>>>>>
>>>>>> From Spec
>>>>>>
>>>>>> 1.5.  Refresh Token - Refresh tokens are issued to the client by the
>>>>>> authorization server and are used to obtain a new access token when
>>>>>> the current access token becomes invalid or expires or to obtain
>>>>>> additional access tokens with identical or narrower scope (access
>>>>>> tokens may have a shorter lifetime and fewer permissions than
>>>>>> authorized by the resource owner).
>>>>>>
>>>>>> 6.  Refreshing an Access Token
>>>>>> The scope of the access request as described by Section 3.3.  The
>>>>>> requested scope MUST NOT include any scope not originally granted by
>>>>>> the resource owner, and if omitted is treated as equal to the scope
>>>>>> originally granted by the resource owner.
>>>>>>
>>>>>> https://datatracker.ietf.org/doc/html/rfc6749
>>>>>>
>>>>>> IMO, from a security aspect, the current behaviour is much more
>>>>>> secure because it is designed to maintain the principle of least pri=
vilege,
>>>>>> where it updates the refresh token authorised scopes based on the re=
quested
>>>>>> ones.
>>>>>>
>>>>>> What should be the correct behaviour?
>>>>>> narrow-down scope refresh token should also be able to request acces=
s
>>>>>> token with original scope list?
>>>>>>
>>>>>>
>>>>>> Also from section 6:
>>>>>>
>>>>>> If a
>>>>>>    new refresh token is issued, the refresh token scope MUST be
>>>>>>    identical to that of the refresh token included by the client in =
the
>>>>>>    request.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> =E2=80=94 Neil
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>>
>>>>> Sachin Mamoru
>>>>> Software Engineer, WSO2
>>>>> +94771292681
>>>>> | sachinmamoru.me  <https://sachinmamoru.me/>
>>>>> sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
>>>>> <https://www.linkedin.com/in/sachin-mamoru/>
>>>>> <https://twitter.com/MamoruSachin>
>>>>>
>>>>>
>>>>
>>>> --
>>>>
>>>> Sachin Mamoru
>>>> Software Engineer, WSO2
>>>> +94771292681
>>>> | sachinmamoru.me  <https://sachinmamoru.me/>
>>>> sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
>>>> <https://www.linkedin.com/in/sachin-mamoru/>
>>>> <https://twitter.com/MamoruSachin>
>>>>
>>>>
>>>
>>> --
>>>
>>> Sachin Mamoru
>>> Software Engineer, WSO2
>>> +94771292681
>>> | sachinmamoru.me  <https://sachinmamoru.me/>
>>> sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
>>> <https://www.linkedin.com/in/sachin-mamoru/>
>>> <https://twitter.com/MamoruSachin>
>>>
>>>
>>>
>>
>> --
>>
>> Sachin Mamoru
>> Software Engineer, WSO2
>> +94771292681
>> | sachinmamoru.me  <https://sachinmamoru.me/>
>> sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
>> <https://www.linkedin.com/in/sachin-mamoru/>
>> <https://twitter.com/MamoruSachin>
>>
>>
>
> --
>
> Sachin Mamoru
> Software Engineer, WSO2
> +94771292681
> | sachinmamoru.me  <https://sachinmamoru.me/>
> sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
> <https://www.linkedin.com/in/sachin-mamoru/>
> <https://twitter.com/MamoruSachin>
>
>
>

--=20

Sachin Mamoru
Software Engineer, WSO2
+94771292681
| sachinmamoru.me  <https://sachinmamoru.me>
sachinmamoru@gmail.com  <sachinmamoru@gmail.com>
<https://www.linkedin.com/in/sachin-mamoru/>
<https://twitter.com/MamoruSachin>

--000000000000be8ccb0611e1138c
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Hi=C2=A0Neil,<div><br></div><div>Since Access tokens are b=
ound to scopes. These scopes define the permissions granted for accessing r=
esources. When an access token is requested, it&#39;s issued with specific =
scopes based on the authorization granted by the resource owner.<br><br>On =
the other hand, Refresh tokens are used to obtain new access tokens when th=
e current access token expires or becomes invalid. The critical aspect here=
 is that the refresh token itself is not bound by scopes in the same way ac=
cess tokens are. Instead, the refresh token carries the potential to issue =
new access tokens with scopes that are the same as or narrower than the ori=
ginal scopes granted during the initial authorization process.<br><br>When =
you use a refresh token to obtain a new access token, you have the option t=
o request a scope that is narrower than the original scope. <br></div><div>=
<br></div><div>This is quite contradicting=C2=A0to me as the spec says that=
=C2=A0&quot;refresh token scopes should be identical=C2=A0to that of the re=
fresh token included by the client in the request&quot;. -=C2=A0When a refr=
esh token is used to obtain a new access token, and a new refresh token is =
also issued in this process, the new refresh token must have the same scope=
 as the refresh token that was used in the request.</div><div>On the other =
hand, it says &quot;Refresh tokens are issued to the client by the authoriz=
ation server and are used to obtain a new access token when the current acc=
ess token becomes invalid or expires, or to obtain additional access tokens=
 with identical or narrower scope&quot;. -=C2=A0There&#39;s a flexibility i=
n scope when using a refresh token to request new access tokens, but this f=
lexibility might seem counterintuitive at first. Specifically, the idea tha=
t the scope of the new access token can be adjusted (narrowed) without alte=
ring the permissions granted by the refresh token itself.</div><div><br></d=
iv><div>Thanks &amp; Regards,</div><div>Sachin</div></div><br><div class=3D=
"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, 21 Feb 2024 at =
13:57, Neil Madden &lt;<a href=3D"mailto:neil.e.madden@gmail.com">neil.e.ma=
dden@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padd=
ing-left:1ex"><div style=3D"overflow-wrap: break-word;"><div>That section q=
uite clearly says &quot;*access tokens* with identical or narrower scope&qu=
ot;. Not refresh tokens.</div><div><br></div><div>-- Neil</div><div><br><bl=
ockquote type=3D"cite"><div>On 21 Feb 2024, at 08:24, Sachin Mamoru &lt;<a =
href=3D"mailto:sachinmamoru@gmail.com" target=3D"_blank">sachinmamoru@gmail=
.com</a>&gt; wrote:</div><br><div><div dir=3D"ltr"><div>Hi Warren and Neil,=
<br></div><div><br></div><div>My basis for asking this is due to the follow=
ing definition [1],</div><div><br></div>Refresh tokens are credentials used=
 to obtain access tokens.=C2=A0 Refresh<br>=C2=A0 =C2=A0tokens are issued t=
o the client by the authorization server and are<br>=C2=A0 =C2=A0used to ob=
tain a new access token when the current access token<br>=C2=A0 =C2=A0becom=
es invalid or expires, or to obtain additional access tokens<br>=C2=A0 =C2=
=A0with identical or <font color=3D"#ff0000">narrower scope </font>(access =
tokens may have a shorter<br>=C2=A0 =C2=A0lifetime and fewer permissions th=
an authorized by the resource<br>=C2=A0 =C2=A0owner).=C2=A0 Issuing a refre=
sh token is optional at the discretion of the<br>=C2=A0 =C2=A0authorization=
 server.=C2=A0 If the authorization server issues a refresh<br>=C2=A0 =C2=
=A0token, it is included when issuing an access token (i.e., step (D) in<br=
>=C2=A0 =C2=A0Figure 1).<br><div><br></div><div>[1]=C2=A0<a href=3D"https:/=
/datatracker.ietf.org/doc/html/rfc6749#section-1.5" target=3D"_blank">https=
://datatracker.ietf.org/doc/html/rfc6749#section-1.5</a></div><div><br></di=
v><div>Thanks &amp; Regards,</div><div>Sachin</div></div><br><div class=3D"=
gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, 21 Feb 2024 at 1=
3:36, Sachin Mamoru &lt;<a href=3D"mailto:sachinmamoru@gmail.com" target=3D=
"_blank">sachinmamoru@gmail.com</a>&gt; wrote:<br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex"><div dir=3D"ltr">Hi=C2=A0Warren and Neil,<=
div><br></div><div>Thanks for the valuable input and sorry for mentioning=
=C2=A0other products, I just wanted to provide an example.=C2=A0</div><div>=
So Warren according to you following is the behaviour that spec suggested.<=
/div><div><font face=3D"arial, sans-serif"><br></font></div><div><span id=
=3D"m_-3937525291925636120m_-8799194716268198968gmail-docs-internal-guid-4f=
39e0eb-7fff-d42a-f780-95f6f69ccd92"><div dir=3D"ltr" style=3D"margin-left:0=
pt" align=3D"left"><table style=3D"border:none;border-collapse:collapse;tab=
le-layout:fixed;width:468pt"><colgroup><col></colgroup><tbody><tr style=3D"=
height:0pt"><td style=3D"border-width:1pt;border-style:solid;border-color:r=
gb(0,0,0);vertical-align:top;padding:5pt;overflow:hidden"><div style=3D"lin=
e-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"background-co=
lor:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;=
font-variant-alternates:normal;vertical-align:baseline"><font face=3D"arial=
, sans-serif">When we request an access token using 3 scopes (scope1, scope=
2, scope3).</font></span></div><font face=3D"arial, sans-serif"><br></font>=
<div style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=
=3D"background-color:transparent;font-variant-numeric:normal;font-variant-e=
ast-asian:normal;font-variant-alternates:normal;vertical-align:baseline"><f=
ont face=3D"arial, sans-serif">Then will receive a refresh token (refresh_t=
oken1) with the access token.</font></span></div><font face=3D"arial, sans-=
serif"><br></font><div style=3D"line-height:1.2;margin-top:0pt;margin-botto=
m:0pt"><span style=3D"background-color:transparent;font-variant-numeric:nor=
mal;font-variant-east-asian:normal;font-variant-alternates:normal;vertical-=
align:baseline"><font face=3D"arial, sans-serif">After that will request an=
other access token with refresh_token1 and provide the scope list as scope1=
 and scope2 (Narrow down scopes).</font></span></div><font face=3D"arial, s=
ans-serif"><br></font><div style=3D"line-height:1.2;margin-top:0pt;margin-b=
ottom:0pt"><span style=3D"background-color:transparent;font-variant-numeric=
:normal;font-variant-east-asian:normal;font-variant-alternates:normal;verti=
cal-align:baseline"><font face=3D"arial, sans-serif">Similarly, get another=
 refresh token (refresh_token2) with the access token.</font></span></div><=
font face=3D"arial, sans-serif"><br></font><div style=3D"line-height:1.2;ma=
rgin-top:0pt;margin-bottom:0pt"><span style=3D"background-color:transparent=
;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-al=
ternates:normal;vertical-align:baseline"><font face=3D"arial, sans-serif">N=
ow if we request another access token with refresh_token2, we should be abl=
e to request scope3 also.</font></span></div><div style=3D"line-height:1.2;=
margin-top:0pt;margin-bottom:0pt"><span style=3D"background-color:transpare=
nt;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-=
alternates:normal;vertical-align:baseline"><font face=3D"arial, sans-serif"=
>That means the refresh token will not be narrowed down instead only the ac=
cess token will get narrowed down.</font></span></div></td></tr></tbody></t=
able></div><br></span></div><div>So Warren and Neil, if possible can you pi=
npoint to me the exact place in the spec where it does explicitly say that =
the refresh token should not be narrowed down based on the given scopes?</d=
iv><div><br></div><div>Thanks &amp; Regards,</div><div>Sachin</div></div><b=
r><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, =
21 Feb 2024 at 01:12, Neil Madden &lt;<a href=3D"mailto:neil.e.madden@gmail=
.com" target=3D"_blank">neil.e.madden@gmail.com</a>&gt; wrote:<br></div><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-lef=
t:1px solid rgb(204,204,204);padding-left:1ex"><div><div>It sounds like the=
y are violating the spec then. On the other hand, the fact that the scope c=
an be &quot;increased back to the original scope&quot; maybe suggests the e=
ffective scope of the refresh token is still the same? Either way, the spec=
 is pretty clear, regardless of what some vendor does.</div><div><br></div>=
<div>-- Neil<br><div><br><blockquote type=3D"cite"><div>On 20 Feb 2024, at =
19:26, Sachin Mamoru &lt;<a href=3D"mailto:sachinmamoru@gmail.com" target=
=3D"_blank">sachinmamoru@gmail.com</a>&gt; wrote:</div><br><div><div dir=3D=
"ltr">Hi Neil,<div><br></div><div>Thanks for the clarification.</div><div>B=
ut Curity has a different approach and they implemented it according to the=
 concept of narrowing down=C2=A0the refresh token scopes.</div><div><br></d=
iv><div>&quot;<span style=3D"color:rgb(77,77,77);font-family:Roboto-Regular=
,-apple-system,&quot;system-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,=
Arial,sans-serif;font-size:17.6px">The scope was originally=C2=A0</span><co=
de style=3D"box-sizing:border-box;font-family:Roboto-Mono,Consolas,Monaco,&=
quot;Andale Mono&quot;,&quot;Ubuntu Mono&quot;,monospace;background-color:r=
gb(247,250,252);border:1px solid rgba(0,0,0,0.05);border-radius:4px;font-si=
ze:14px;padding:0.15em 0.2em 0.05em;word-break:break-word;color:rgb(77,77,7=
7)">read openid profile</code><span style=3D"color:rgb(77,77,77);font-famil=
y:Roboto-Regular,-apple-system,&quot;system-ui&quot;,&quot;Segoe UI&quot;,R=
oboto,Helvetica,Arial,sans-serif;font-size:17.6px">=C2=A0and after refresh =
the access was reduced to=C2=A0</span><code style=3D"box-sizing:border-box;=
font-family:Roboto-Mono,Consolas,Monaco,&quot;Andale Mono&quot;,&quot;Ubunt=
u Mono&quot;,monospace;background-color:rgb(247,250,252);border:1px solid r=
gba(0,0,0,0.05);border-radius:4px;font-size:14px;padding:0.15em 0.2em 0.05e=
m;word-break:break-word;color:rgb(77,77,77)">read profile</code><span style=
=3D"color:rgb(77,77,77);font-family:Roboto-Regular,-apple-system,&quot;syst=
em-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif;font-siz=
e:17.6px">=C2=A0(i.e., the=C2=A0</span><code style=3D"box-sizing:border-box=
;font-family:Roboto-Mono,Consolas,Monaco,&quot;Andale Mono&quot;,&quot;Ubun=
tu Mono&quot;,monospace;background-color:rgb(247,250,252);border:1px solid =
rgba(0,0,0,0.05);border-radius:4px;font-size:14px;padding:0.15em 0.2em 0.05=
em;word-break:break-word;color:rgb(77,77,77)">access_token</code><span styl=
e=3D"color:rgb(77,77,77);font-family:Roboto-Regular,-apple-system,&quot;sys=
tem-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif;font-si=
ze:17.6px">=C2=A0now only has=C2=A0</span><code style=3D"box-sizing:border-=
box;font-family:Roboto-Mono,Consolas,Monaco,&quot;Andale Mono&quot;,&quot;U=
buntu Mono&quot;,monospace;background-color:rgb(247,250,252);border:1px sol=
id rgba(0,0,0,0.05);border-radius:4px;font-size:14px;padding:0.15em 0.2em 0=
.05em;word-break:break-word;color:rgb(77,77,77)">read profile</code><span s=
tyle=3D"color:rgb(77,77,77);font-family:Roboto-Regular,-apple-system,&quot;=
system-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif;font=
-size:17.6px">=C2=A0scope and any new tokens obtained using the refresh tok=
en=C2=A0</span><code style=3D"box-sizing:border-box;font-family:Roboto-Mono=
,Consolas,Monaco,&quot;Andale Mono&quot;,&quot;Ubuntu Mono&quot;,monospace;=
background-color:rgb(247,250,252);border:1px solid rgba(0,0,0,0.05);border-=
radius:4px;font-size:14px;padding:0.15em 0.2em 0.05em;word-break:break-word=
;color:rgb(77,77,77)">daa38700-ba96-4ef1-8b30-5cb3527aae19</code><span styl=
e=3D"color:rgb(77,77,77);font-family:Roboto-Regular,-apple-system,&quot;sys=
tem-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif;font-si=
ze:17.6px">=C2=A0will have the same, reduced scope). Note that=C2=A0</span>=
<em style=3D"box-sizing:border-box;font-family:Roboto-Regular,-apple-system=
,&quot;system-ui&quot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-ser=
if;color:rgb(77,77,77);font-size:17.6px">increasing</em><span style=3D"colo=
r:rgb(77,77,77);font-family:Roboto-Regular,-apple-system,&quot;system-ui&qu=
ot;,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif;font-size:17.6px=
">=C2=A0the scope of access cannot be done in this way unless first reduced=
 and increased back to the original scope.</span>&quot;</div><div><br></div=
><div>[1]=C2=A0<a href=3D"https://curity.io/resources/learn/refresh-tokens/=
#changing-scope-of-access-token-on-refresh" target=3D"_blank">https://curit=
y.io/resources/learn/refresh-tokens/#changing-scope-of-access-token-on-refr=
esh</a></div><div><br></div><div>Thanks &amp; Regards,</div><div>Sachin</di=
v></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr=
">On Tue, 20 Feb 2024 at 21:59, Neil Madden &lt;<a href=3D"mailto:neil.e.ma=
dden@gmail.com" target=3D"_blank">neil.e.madden@gmail.com</a>&gt; wrote:<br=
></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"auto">=
<div dir=3D"ltr"></div><div dir=3D"ltr"><br></div><div dir=3D"ltr"><br><blo=
ckquote type=3D"cite">On 20 Feb 2024, at 11:02, Sachin Mamoru &lt;<a href=
=3D"mailto:sachinmamoru@gmail.com" target=3D"_blank">sachinmamoru@gmail.com=
</a>&gt; wrote:<br><br></blockquote></div><blockquote type=3D"cite"><div di=
r=3D"ltr">=EF=BB=BF<div dir=3D"ltr">Hi Neil,<div><br></div><div>Does that m=
ean it should be identical to the narrowed scope request or the original re=
quest scope?</div></div></div></blockquote><div><br></div><div>It says it h=
as to be identical to the scope of the existing refresh token in the reques=
t, not the scope specified in the request. So effectively you can never dow=
nscope a refresh token in this way. Whatever scope you specify, any RT retu=
rned must always retain the original scope.=C2=A0</div><div><br></div><div>=
(There are other ways to downscope a RT, eg ForgeRock=E2=80=99s macaroons a=
llow you to attenuate the scope if you wish).=C2=A0</div><div><br></div><di=
v>=E2=80=94 Neil</div><br><blockquote type=3D"cite"><div dir=3D"ltr"><br><d=
iv class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Tue, 20 F=
eb 2024 at 16:31, Sachin Mamoru &lt;<a href=3D"mailto:sachinmamoru@gmail.co=
m" target=3D"_blank">sachinmamoru@gmail.com</a>&gt; wrote:<br></div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1p=
x solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><br></div><br><=
div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Tue, 20 =
Feb 2024 at 12:23, Neil Madden &lt;<a href=3D"mailto:neil.e.madden@gmail.co=
m" target=3D"_blank">neil.e.madden@gmail.com</a>&gt; wrote:<br></div><block=
quote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1=
px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"auto"><div dir=3D"l=
tr"></div><div dir=3D"ltr"><br></div><div dir=3D"ltr"><blockquote type=3D"c=
ite">On 20 Feb 2024, at 06:44, Sachin Mamoru &lt;<a href=3D"mailto:sachinma=
moru@gmail.com" target=3D"_blank">sachinmamoru@gmail.com</a>&gt; wrote:<br>=
<br></blockquote></div><blockquote type=3D"cite"><div dir=3D"ltr">=EF=BB=BF=
<div dir=3D"ltr">Hi All,<div><br></div><div><div style=3D"line-height:1.2;m=
argin-top:0pt;margin-bottom:0pt"><span style=3D"background-color:transparen=
t;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-a=
lternates:normal;vertical-align:baseline"><font face=3D"arial, sans-serif">=
When we request an access token using 3 scopes (scope1, scope2, scope3).</f=
ont></span></div><div style=3D"line-height:1.2;margin-top:0pt;margin-bottom=
:0pt"><span style=3D"background-color:transparent;font-variant-numeric:norm=
al;font-variant-east-asian:normal;font-variant-alternates:normal;vertical-a=
lign:baseline"><font face=3D"arial, sans-serif">Then will receive a refresh=
 token (refresh_token1) with the access token.</font></span></div><font fac=
e=3D"arial, sans-serif"><br></font><div style=3D"line-height:1.2;margin-top=
:0pt;margin-bottom:0pt"><span style=3D"background-color:transparent;font-va=
riant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates=
:normal;vertical-align:baseline"><font face=3D"arial, sans-serif">After tha=
t will request another access token with refresh_token1 and provide the sco=
pe list as scope1 and scope2 (Narrow down scopes).</font></span></div><div =
style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"b=
ackground-color:transparent;font-variant-numeric:normal;font-variant-east-a=
sian:normal;font-variant-alternates:normal;vertical-align:baseline"><font f=
ace=3D"arial, sans-serif">Similarly, get another refresh token (refresh_tok=
en2) with the access token.</font></span></div><font face=3D"arial, sans-se=
rif"><br></font><div style=3D"line-height:1.2;margin-top:0pt;margin-bottom:=
0pt"><span style=3D"background-color:transparent;font-variant-numeric:norma=
l;font-variant-east-asian:normal;font-variant-alternates:normal;vertical-al=
ign:baseline"><font face=3D"arial, sans-serif">Now if we request another ac=
cess token with refresh_token2, we cannot request scope3, instead, we can e=
ither request both scope1 and scope2 or one of them.<br></font></span></div=
><font face=3D"arial, sans-serif"><br></font><div style=3D"line-height:1.2;=
margin-top:0pt;margin-bottom:0pt"><span style=3D"background-color:transpare=
nt;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-=
alternates:normal;vertical-align:baseline"><font face=3D"arial, sans-serif"=
>But in the specification, didn&#39;t able to find anything related to narr=
ow-down scopes with refresh token.</font></span></div><font face=3D"arial, =
sans-serif"><br></font><div style=3D"line-height:1.2;margin-top:0pt;margin-=
bottom:0pt"><span style=3D"background-color:transparent;font-variant-numeri=
c:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text=
-decoration-line:underline;vertical-align:baseline"><font face=3D"arial, sa=
ns-serif">From Spec</font></span></div><font face=3D"arial, sans-serif"><br=
></font><div style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><fo=
nt face=3D"arial, sans-serif"><span style=3D"background-color:transparent;f=
ont-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alte=
rnates:normal;vertical-align:baseline">1.5.=C2=A0 Refresh Token -=C2=A0</sp=
an><span style=3D"background-color:transparent">Refresh tokens are issued t=
o the client by the authorization server and are=C2=A0</span><span style=3D=
"background-color:transparent">used to obtain a new access token when the c=
urrent access token=C2=A0</span><span style=3D"background-color:transparent=
">becomes invalid or expires or to obtain additional access tokens=C2=A0</s=
pan><span style=3D"background-color:transparent">with identical or narrower=
 scope (access tokens may have a shorter=C2=A0</span><span style=3D"backgro=
und-color:transparent">lifetime and fewer permissions than authorized by th=
e resource=C2=A0</span><span style=3D"background-color:transparent">owner).=
</span></font></div><font face=3D"arial, sans-serif"><br></font><div style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"backgr=
ound-color:transparent;font-variant-numeric:normal;font-variant-east-asian:=
normal;font-variant-alternates:normal;vertical-align:baseline"><font face=
=3D"arial, sans-serif">6.=C2=A0 Refreshing an Access Token</font></span></d=
iv><div style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><font fa=
ce=3D"arial, sans-serif"><span style=3D"background-color:transparent;font-v=
ariant-numeric:normal;font-variant-east-asian:normal;font-variant-alternate=
s:normal;vertical-align:baseline">The scope of the access request as descri=
bed by=C2=A0</span><span style=3D"background-color:transparent">Section 3.3=
.=C2=A0 The requested scope MUST NOT include any scope=C2=A0</span><span st=
yle=3D"background-color:transparent">not originally granted by the resource=
 owner, and if omitted is=C2=A0</span><span style=3D"background-color:trans=
parent">treated as equal to the scope originally granted by the=C2=A0</span=
><span style=3D"background-color:transparent">resource owner.</span></font>=
</div><font face=3D"arial, sans-serif"><br></font><div style=3D"line-height=
:1.2;margin-top:0pt;margin-bottom:0pt"><a href=3D"https://datatracker.ietf.=
org/doc/html/rfc6749" style=3D"text-decoration-line:none" target=3D"_blank"=
><span style=3D"background-color:transparent;font-variant-numeric:normal;fo=
nt-variant-east-asian:normal;font-variant-alternates:normal;text-decoration=
-line:underline;vertical-align:baseline"><font face=3D"arial, sans-serif">h=
ttps://datatracker.ietf.org/doc/html/rfc6749</font></span></a></div><div st=
yle=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><font face=3D"aria=
l, sans-serif"><br></font></div><div style=3D"line-height:1.2;margin-top:0p=
t;margin-bottom:0pt"><font face=3D"arial, sans-serif">IMO, from a security =
aspect, the current behaviour is much more secure because it is designed to=
 maintain the principle of least privilege, where it updates the refresh to=
ken authorised scopes based on the requested ones.</font></div><div style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><br></div><div style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt">What should be the co=
rrect behaviour?<br>narrow-down scope refresh token should also be able to =
request access token with original scope list?<font face=3D"arial, sans-ser=
if"><br></font></div></div></div></div></blockquote><div><br></div><div>Als=
o from section 6:</div><div><br></div><div><pre style=3D"box-sizing:border-=
box;font-size:11.04px;margin-bottom:0px;overflow:visible;padding:0px;width:=
80ch;color:rgb(32,37,42)">If a
   new refresh token is issued, the refresh token scope MUST be
   identical to that of the refresh token included by the client in the
   request.</pre><pre style=3D"box-sizing:border-box;font-size:11.04px;marg=
in-bottom:0px;overflow:visible;padding:0px;width:80ch;color:rgb(32,37,42)">=
<br></pre><pre style=3D"box-sizing:border-box;font-size:11.04px;margin-bott=
om:0px;overflow:visible;padding:0px;width:80ch;color:rgb(32,37,42)"><br></p=
re><pre style=3D"box-sizing:border-box;font-size:11.04px;margin-bottom:0px;=
overflow:visible;padding:0px;width:80ch;color:rgb(32,37,42)"><br></pre><pre=
 style=3D"box-sizing:border-box;font-size:11.04px;margin-bottom:0px;overflo=
w:visible;padding:0px;width:80ch;color:rgb(32,37,42)"><br></pre><pre style=
=3D"box-sizing:border-box;font-size:11.04px;margin-bottom:0px;overflow:visi=
ble;padding:0px;width:80ch;color:rgb(32,37,42)">=E2=80=94 Neil</pre></div><=
/div></blockquote></div><br clear=3D"all"><div><br></div><span class=3D"gma=
il_signature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signatur=
e"><div dir=3D"ltr"><div dir=3D"ltr"><table style=3D"direction:ltr;border-c=
ollapse:collapse"><tbody><tr><td style=3D"font-size:0px;height:12px;line-he=
ight:0"></td></tr><tr><td><table cellpadding=3D"0" cellspacing=3D"0" style=
=3D"border-collapse:collapse;font-family:Arial;line-height:1.15"><tbody><tr=
><td style=3D"vertical-align:top;padding:0.01px 14px 0.01px 0.01px"><table =
cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;width=
:65px"><tbody><tr><td style=3D"padding:0.01px 10px 0px 0px"><img src=3D"htt=
ps://d36urhup7zbd7q.cloudfront.net/29e6c216-f94e-4bc3-8205-f3ea762db0d5/pro=
file.format_png.resize_200x.jpeg" height=3D"auto" width=3D"65" style=3D"wid=
th: 65px; vertical-align: initial; border-radius: 0px; display: block;"></t=
d></tr></tbody></table></td><td height=3D"1" width=3D"0" style=3D"width:0px=
;padding:0.01px;border-right:1px solid rgb(189,189,189);height:1px;font-siz=
e:1pt">=C2=A0</td><td style=3D"padding:0.01px 0.01px 0.01px 14px;vertical-a=
lign:top" valign=3D"top"><table cellpadding=3D"0" cellspacing=3D"0" style=
=3D"border-collapse:collapse"><tbody><tr><td style=3D"line-height:1.2;paddi=
ng:0.01px 0.01px 12px"><span style=3D"font-family:Arial;text-transform:init=
ial;font-weight:bold"><span style=3D"color:rgb(100,100,100);font-size:16px"=
> Sachin Mamoru </span></span><br><span style=3D"font-size:13px;letter-spac=
ing:0px;font-family:Arial;text-transform:initial;font-weight:bold;color:rgb=
(100,100,100)"> Software Engineer, </span> <span style=3D"font-size:13px;le=
tter-spacing:0px;font-family:Arial;text-transform:initial;font-weight:bold;=
color:rgb(100,100,100)"> WSO2</span></td></tr><tr><td style=3D"padding:0.01=
px;line-height:0"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"borde=
r-collapse:collapse"><tbody><tr><td style=3D"padding:0.01px"><table cellpad=
ding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr>=
<td style=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D=
"0" cellspacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;fo=
nt-size:12px;font-family:Arial"><tbody><tr><td style=3D"padding:0.01px;font=
-family:Arial;font-size:12px"><a href=3D"tel:+94771292681" style=3D"text-de=
coration:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span st=
yle=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:no=
wrap;font-size:12px"> +94771292681</span></a></td></tr></tbody></table></td=
><td style=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=
=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;line-height:14px=
;font-size:12px;font-family:Arial"><tbody><tr><td style=3D"padding:0px 4px"=
><span style=3D"font-family:Arial;font-weight:bold;font-size:12px;color:rgb=
(33,33,33);vertical-align:2px"> | </span></td><td style=3D"padding:0.01px;f=
ont-family:Arial;font-size:12px"><a href=3D"https://sachinmamoru.me/" style=
=3D"text-decoration:unset;font-size:12px;font-family:Arial" target=3D"_blan=
k"><span style=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;whi=
te-space:nowrap;font-size:12px"> sachinmamoru.me=C2=A0</span></a></td></tr>=
</tbody></table></td></tr></tbody></table></td></tr><tr><td style=3D"paddin=
g:0.01px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collap=
se:collapse"><tbody><tr><td style=3D"line-height:0;padding:0.01px 0.01px 6p=
x"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:coll=
apse;line-height:14px;font-size:12px;font-family:Arial"><tbody><tr><td styl=
e=3D"padding:0.01px;font-family:Arial;font-size:12px"><a href=3D"mailto:sac=
hinmamoru@gmail.com" style=3D"text-decoration:unset;font-size:12px;font-fam=
ily:Arial" target=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33=
,33);font-family:Arial;white-space:nowrap;font-size:12px"> sachinmamoru@gma=
il.com=C2=A0</span></a></td></tr></tbody></table></td></tr></tbody></table>=
</td></tr></tbody></table></td></tr><tr><td style=3D"padding:12px 0.01px 0.=
01px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:c=
ollapse;width:100%"><tbody><tr><td style=3D"padding:0.01px"><table border=
=3D"0" cellpadding=3D"0" cellspacing=3D"0"><tbody><tr><td align=3D"left" st=
yle=3D"padding-right:6px;text-align:center;padding-top:0px"><a href=3D"http=
s://www.linkedin.com/in/sachin-mamoru/" target=3D"_blank"><img width=3D"25"=
 height=3D"25" src=3D"https://cdn.gifo.wisestamp.com/s/ld/0077b5/50/0/backg=
round.png" style=3D"float: left; border: none;" border=3D"0"></a></td><td a=
lign=3D"left" style=3D"padding-right:6px;text-align:center;padding-top:0px"=
><a href=3D"https://twitter.com/MamoruSachin" target=3D"_blank"><img width=
=3D"25" height=3D"25" src=3D"https://cdn.gifo.wisestamp.com/s/tw/55acee/50/=
0/background.png" style=3D"float: left; border: none;" border=3D"0"></a></t=
d></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>=
</td></tr></tbody></table><table cellpadding=3D"0" cellspacing=3D"0" border=
=3D"0" style=3D"max-width:600px;width:100%"><tbody><tr><td style=3D"line-he=
ight:0"></td></tr></tbody></table></td></tr></tbody></table><br></div><img =
src=3D"https://tracy.srv.wisestamp.com/px/5434123278745600.png" alt=3D""></=
div></div>
</blockquote></div><br clear=3D"all"><div><br></div><span class=3D"gmail_si=
gnature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signature"><d=
iv dir=3D"ltr"><div dir=3D"ltr"><table style=3D"direction:ltr;border-collap=
se:collapse"><tbody><tr><td style=3D"font-size:0px;height:12px;line-height:=
0"></td></tr><tr><td><table cellpadding=3D"0" cellspacing=3D"0" style=3D"bo=
rder-collapse:collapse;font-family:Arial;line-height:1.15"><tbody><tr><td s=
tyle=3D"vertical-align:top;padding:0.01px 14px 0.01px 0.01px"><table cellpa=
dding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;width:65px"=
><tbody><tr><td style=3D"padding:0.01px 10px 0px 0px"><img src=3D"https://d=
36urhup7zbd7q.cloudfront.net/29e6c216-f94e-4bc3-8205-f3ea762db0d5/profile.f=
ormat_png.resize_200x.jpeg" height=3D"auto" width=3D"65" style=3D"width: 65=
px; vertical-align: initial; border-radius: 0px; display: block;"></td></tr=
></tbody></table></td><td height=3D"1" width=3D"0" style=3D"width:0px;paddi=
ng:0.01px;border-right:1px solid rgb(189,189,189);height:1px;font-size:1pt"=
>=C2=A0</td><td style=3D"padding:0.01px 0.01px 0.01px 14px;vertical-align:t=
op" valign=3D"top"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"bord=
er-collapse:collapse"><tbody><tr><td style=3D"line-height:1.2;padding:0.01p=
x 0.01px 12px"><span style=3D"font-family:Arial;text-transform:initial;font=
-weight:bold"><span style=3D"color:rgb(100,100,100);font-size:16px"> Sachin=
 Mamoru </span></span><br><span style=3D"font-size:13px;letter-spacing:0px;=
font-family:Arial;text-transform:initial;font-weight:bold;color:rgb(100,100=
,100)"> Software Engineer, </span> <span style=3D"font-size:13px;letter-spa=
cing:0px;font-family:Arial;text-transform:initial;font-weight:bold;color:rg=
b(100,100,100)"> WSO2</span></td></tr><tr><td style=3D"padding:0.01px;line-=
height:0"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collap=
se:collapse"><tbody><tr><td style=3D"padding:0.01px"><table cellpadding=3D"=
0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td styl=
e=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cell=
spacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-size:=
12px;font-family:Arial"><tbody><tr><td style=3D"padding:0.01px;font-family:=
Arial;font-size:12px"><a href=3D"tel:+94771292681" style=3D"text-decoration=
:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span style=3D"l=
ine-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:nowrap;fon=
t-size:12px"> +94771292681</span></a></td></tr></tbody></table></td><td sty=
le=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cel=
lspacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-size=
:12px;font-family:Arial"><tbody><tr><td style=3D"padding:0px 4px"><span sty=
le=3D"font-family:Arial;font-weight:bold;font-size:12px;color:rgb(33,33,33)=
;vertical-align:2px"> | </span></td><td style=3D"padding:0.01px;font-family=
:Arial;font-size:12px"><a href=3D"https://sachinmamoru.me/" style=3D"text-d=
ecoration:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span s=
tyle=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:n=
owrap;font-size:12px"> sachinmamoru.me=C2=A0</span></a></td></tr></tbody></=
table></td></tr></tbody></table></td></tr><tr><td style=3D"padding:0.01px">=
<table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collaps=
e"><tbody><tr><td style=3D"line-height:0;padding:0.01px 0.01px 6px"><table =
cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;line-=
height:14px;font-size:12px;font-family:Arial"><tbody><tr><td style=3D"paddi=
ng:0.01px;font-family:Arial;font-size:12px"><a href=3D"mailto:sachinmamoru@=
gmail.com" style=3D"text-decoration:unset;font-size:12px;font-family:Arial"=
 target=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33,33);font-=
family:Arial;white-space:nowrap;font-size:12px"> sachinmamoru@gmail.com=C2=
=A0</span></a></td></tr></tbody></table></td></tr></tbody></table></td></tr=
></tbody></table></td></tr><tr><td style=3D"padding:12px 0.01px 0.01px"><ta=
ble cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;w=
idth:100%"><tbody><tr><td style=3D"padding:0.01px"><table border=3D"0" cell=
padding=3D"0" cellspacing=3D"0"><tbody><tr><td align=3D"left" style=3D"padd=
ing-right:6px;text-align:center;padding-top:0px"><a href=3D"https://www.lin=
kedin.com/in/sachin-mamoru/" target=3D"_blank"><img width=3D"25" height=3D"=
25" src=3D"https://cdn.gifo.wisestamp.com/s/ld/0077b5/50/0/background.png" =
style=3D"float: left; border: none;" border=3D"0"></a></td><td align=3D"lef=
t" style=3D"padding-right:6px;text-align:center;padding-top:0px"><a href=3D=
"https://twitter.com/MamoruSachin" target=3D"_blank"><img width=3D"25" heig=
ht=3D"25" src=3D"https://cdn.gifo.wisestamp.com/s/tw/55acee/50/0/background=
.png" style=3D"float: left; border: none;" border=3D"0"></a></td></tr></tbo=
dy></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></=
tbody></table><table cellpadding=3D"0" cellspacing=3D"0" border=3D"0" style=
=3D"max-width:600px;width:100%"><tbody><tr><td style=3D"line-height:0"></td=
></tr></tbody></table></td></tr></tbody></table><br></div><img src=3D"https=
://tracy.srv.wisestamp.com/px/5434123278745600.png" alt=3D""></div></div>
</div></blockquote></div></blockquote></div><br clear=3D"all"><div><br></di=
v><span class=3D"gmail_signature_prefix">-- </span><br><div dir=3D"ltr" cla=
ss=3D"gmail_signature"><div dir=3D"ltr"><div dir=3D"ltr"><table style=3D"di=
rection:ltr;border-collapse:collapse"><tbody><tr><td style=3D"font-size:0px=
;height:12px;line-height:0"></td></tr><tr><td><table cellpadding=3D"0" cell=
spacing=3D"0" style=3D"border-collapse:collapse;font-family:Arial;line-heig=
ht:1.15"><tbody><tr><td style=3D"vertical-align:top;padding:0.01px 14px 0.0=
1px 0.01px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-coll=
apse:collapse;width:65px"><tbody><tr><td style=3D"padding:0.01px 10px 0px 0=
px"><img src=3D"https://d36urhup7zbd7q.cloudfront.net/29e6c216-f94e-4bc3-82=
05-f3ea762db0d5/profile.format_png.resize_200x.jpeg" height=3D"auto" width=
=3D"65" style=3D"width: 65px; vertical-align: initial; border-radius: 0px; =
display: block;"></td></tr></tbody></table></td><td height=3D"1" width=3D"0=
" style=3D"width:0px;padding:0.01px;border-right:1px solid rgb(189,189,189)=
;height:1px;font-size:1pt">=C2=A0</td><td style=3D"padding:0.01px 0.01px 0.=
01px 14px;vertical-align:top" valign=3D"top"><table cellpadding=3D"0" cells=
pacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td style=3D"lin=
e-height:1.2;padding:0.01px 0.01px 12px"><span style=3D"font-family:Arial;t=
ext-transform:initial;font-weight:bold"><span style=3D"color:rgb(100,100,10=
0);font-size:16px"> Sachin Mamoru </span></span><br><span style=3D"font-siz=
e:13px;letter-spacing:0px;font-family:Arial;text-transform:initial;font-wei=
ght:bold;color:rgb(100,100,100)"> Software Engineer, </span> <span style=3D=
"font-size:13px;letter-spacing:0px;font-family:Arial;text-transform:initial=
;font-weight:bold;color:rgb(100,100,100)"> WSO2</span></td></tr><tr><td sty=
le=3D"padding:0.01px;line-height:0"><table cellpadding=3D"0" cellspacing=3D=
"0" style=3D"border-collapse:collapse"><tbody><tr><td style=3D"padding:0.01=
px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:col=
lapse"><tbody><tr><td style=3D"line-height:0;padding:0.01px 0.01px 6px"><ta=
ble cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;l=
ine-height:14px;font-size:12px;font-family:Arial"><tbody><tr><td style=3D"p=
adding:0.01px;font-family:Arial;font-size:12px"><a href=3D"tel:+94771292681=
" style=3D"text-decoration:unset;font-size:12px;font-family:Arial" target=
=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33,33);font-family:=
Arial;white-space:nowrap;font-size:12px"> +94771292681</span></a></td></tr>=
</tbody></table></td><td style=3D"line-height:0;padding:0.01px 0.01px 6px">=
<table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collaps=
e;line-height:14px;font-size:12px;font-family:Arial"><tbody><tr><td style=
=3D"padding:0px 4px"><span style=3D"font-family:Arial;font-weight:bold;font=
-size:12px;color:rgb(33,33,33);vertical-align:2px"> | </span></td><td style=
=3D"padding:0.01px;font-family:Arial;font-size:12px"><a href=3D"https://sac=
hinmamoru.me/" style=3D"text-decoration:unset;font-size:12px;font-family:Ar=
ial" target=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33,33);f=
ont-family:Arial;white-space:nowrap;font-size:12px"> sachinmamoru.me=C2=A0<=
/span></a></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr=
><td style=3D"padding:0.01px"><table cellpadding=3D"0" cellspacing=3D"0" st=
yle=3D"border-collapse:collapse"><tbody><tr><td style=3D"line-height:0;padd=
ing:0.01px 0.01px 6px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"=
border-collapse:collapse;line-height:14px;font-size:12px;font-family:Arial"=
><tbody><tr><td style=3D"padding:0.01px;font-family:Arial;font-size:12px"><=
a href=3D"mailto:sachinmamoru@gmail.com" style=3D"text-decoration:unset;fon=
t-size:12px;font-family:Arial" target=3D"_blank"><span style=3D"line-height=
:1.2;color:rgb(33,33,33);font-family:Arial;white-space:nowrap;font-size:12p=
x"> sachinmamoru@gmail.com=C2=A0</span></a></td></tr></tbody></table></td><=
/tr></tbody></table></td></tr></tbody></table></td></tr><tr><td style=3D"pa=
dding:12px 0.01px 0.01px"><table cellpadding=3D"0" cellspacing=3D"0" style=
=3D"border-collapse:collapse;width:100%"><tbody><tr><td style=3D"padding:0.=
01px"><table border=3D"0" cellpadding=3D"0" cellspacing=3D"0"><tbody><tr><t=
d align=3D"left" style=3D"padding-right:6px;text-align:center;padding-top:0=
px"><a href=3D"https://www.linkedin.com/in/sachin-mamoru/" target=3D"_blank=
"><img width=3D"25" height=3D"25" src=3D"https://cdn.gifo.wisestamp.com/s/l=
d/0077b5/50/0/background.png" style=3D"float: left; border: none;" border=
=3D"0"></a></td><td align=3D"left" style=3D"padding-right:6px;text-align:ce=
nter;padding-top:0px"><a href=3D"https://twitter.com/MamoruSachin" target=
=3D"_blank"><img width=3D"25" height=3D"25" src=3D"https://cdn.gifo.wisesta=
mp.com/s/tw/55acee/50/0/background.png" style=3D"float: left; border: none;=
" border=3D"0"></a></td></tr></tbody></table></td></tr></tbody></table></td=
></tr></tbody></table></td></tr></tbody></table><table cellpadding=3D"0" ce=
llspacing=3D"0" border=3D"0" style=3D"max-width:600px;width:100%"><tbody><t=
r><td style=3D"line-height:0"></td></tr></tbody></table></td></tr></tbody><=
/table><br></div><img src=3D"https://tracy.srv.wisestamp.com/px/54341232787=
45600.png" alt=3D""></div></div>
</div></blockquote></div><br></div></div></blockquote></div><br clear=3D"al=
l"><div><br></div><span class=3D"gmail_signature_prefix">-- </span><br><div=
 dir=3D"ltr" class=3D"gmail_signature"><div dir=3D"ltr"><div dir=3D"ltr"><t=
able style=3D"direction:ltr;border-collapse:collapse"><tbody><tr><td style=
=3D"font-size:0px;height:12px;line-height:0"></td></tr><tr><td><table cellp=
adding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;font-famil=
y:Arial;line-height:1.15"><tbody><tr><td style=3D"vertical-align:top;paddin=
g:0.01px 14px 0.01px 0.01px"><table cellpadding=3D"0" cellspacing=3D"0" sty=
le=3D"border-collapse:collapse;width:65px"><tbody><tr><td style=3D"padding:=
0.01px 10px 0px 0px"><img src=3D"https://d36urhup7zbd7q.cloudfront.net/29e6=
c216-f94e-4bc3-8205-f3ea762db0d5/profile.format_png.resize_200x.jpeg" heigh=
t=3D"auto" width=3D"65" style=3D"width: 65px; vertical-align: initial; bord=
er-radius: 0px; display: block;"></td></tr></tbody></table></td><td height=
=3D"1" width=3D"0" style=3D"width:0px;padding:0.01px;border-right:1px solid=
 rgb(189,189,189);height:1px;font-size:1pt">=C2=A0</td><td style=3D"padding=
:0.01px 0.01px 0.01px 14px;vertical-align:top" valign=3D"top"><table cellpa=
dding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr=
><td style=3D"line-height:1.2;padding:0.01px 0.01px 12px"><span style=3D"fo=
nt-family:Arial;text-transform:initial;font-weight:bold"><span style=3D"col=
or:rgb(100,100,100);font-size:16px"> Sachin Mamoru </span></span><br><span =
style=3D"font-size:13px;letter-spacing:0px;font-family:Arial;text-transform=
:initial;font-weight:bold;color:rgb(100,100,100)"> Software Engineer, </spa=
n> <span style=3D"font-size:13px;letter-spacing:0px;font-family:Arial;text-=
transform:initial;font-weight:bold;color:rgb(100,100,100)"> WSO2</span></td=
></tr><tr><td style=3D"padding:0.01px;line-height:0"><table cellpadding=3D"=
0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td styl=
e=3D"padding:0.01px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"bo=
rder-collapse:collapse"><tbody><tr><td style=3D"line-height:0;padding:0.01p=
x 0.01px 6px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-co=
llapse:collapse;line-height:14px;font-size:12px;font-family:Arial"><tbody><=
tr><td style=3D"padding:0.01px;font-family:Arial;font-size:12px"><a href=3D=
"tel:+94771292681" style=3D"text-decoration:unset;font-size:12px;font-famil=
y:Arial" target=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33,3=
3);font-family:Arial;white-space:nowrap;font-size:12px"> +94771292681</span=
></a></td></tr></tbody></table></td><td style=3D"line-height:0;padding:0.01=
px 0.01px 6px"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-c=
ollapse:collapse;line-height:14px;font-size:12px;font-family:Arial"><tbody>=
<tr><td style=3D"padding:0px 4px"><span style=3D"font-family:Arial;font-wei=
ght:bold;font-size:12px;color:rgb(33,33,33);vertical-align:2px"> | </span><=
/td><td style=3D"padding:0.01px;font-family:Arial;font-size:12px"><a href=
=3D"https://sachinmamoru.me/" style=3D"text-decoration:unset;font-size:12px=
;font-family:Arial" target=3D"_blank"><span style=3D"line-height:1.2;color:=
rgb(33,33,33);font-family:Arial;white-space:nowrap;font-size:12px"> sachinm=
amoru.me=C2=A0</span></a></td></tr></tbody></table></td></tr></tbody></tabl=
e></td></tr><tr><td style=3D"padding:0.01px"><table cellpadding=3D"0" cells=
pacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td style=3D"lin=
e-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cellspacing=
=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-size:12px;fo=
nt-family:Arial"><tbody><tr><td style=3D"padding:0.01px;font-family:Arial;f=
ont-size:12px"><a href=3D"mailto:sachinmamoru@gmail.com" style=3D"text-deco=
ration:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span styl=
e=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:nowr=
ap;font-size:12px"> sachinmamoru@gmail.com=C2=A0</span></a></td></tr></tbod=
y></table></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr=
><td style=3D"padding:12px 0.01px 0.01px"><table cellpadding=3D"0" cellspac=
ing=3D"0" style=3D"border-collapse:collapse;width:100%"><tbody><tr><td styl=
e=3D"padding:0.01px"><table border=3D"0" cellpadding=3D"0" cellspacing=3D"0=
"><tbody><tr><td align=3D"left" style=3D"padding-right:6px;text-align:cente=
r;padding-top:0px"><a href=3D"https://www.linkedin.com/in/sachin-mamoru/" t=
arget=3D"_blank"><img width=3D"25" height=3D"25" src=3D"https://cdn.gifo.wi=
sestamp.com/s/ld/0077b5/50/0/background.png" style=3D"float: left; border: =
none;" border=3D"0"></a></td><td align=3D"left" style=3D"padding-right:6px;=
text-align:center;padding-top:0px"><a href=3D"https://twitter.com/MamoruSac=
hin" target=3D"_blank"><img width=3D"25" height=3D"25" src=3D"https://cdn.g=
ifo.wisestamp.com/s/tw/55acee/50/0/background.png" style=3D"float: left; bo=
rder: none;" border=3D"0"></a></td></tr></tbody></table></td></tr></tbody><=
/table></td></tr></tbody></table></td></tr></tbody></table><table cellpaddi=
ng=3D"0" cellspacing=3D"0" border=3D"0" style=3D"max-width:600px;width:100%=
"><tbody><tr><td style=3D"line-height:0"></td></tr></tbody></table></td></t=
r></tbody></table><br></div><img src=3D"https://tracy.srv.wisestamp.com/px/=
5434123278745600.png" alt=3D""></div></div>
</blockquote></div><br clear=3D"all"><div><br></div><span class=3D"gmail_si=
gnature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signature"><d=
iv dir=3D"ltr"><div dir=3D"ltr"><table style=3D"direction:ltr;border-collap=
se:collapse"><tbody><tr><td style=3D"font-size:0px;height:12px;line-height:=
0"></td></tr><tr><td><table cellpadding=3D"0" cellspacing=3D"0" style=3D"bo=
rder-collapse:collapse;font-family:Arial;line-height:1.15"><tbody><tr><td s=
tyle=3D"vertical-align:top;padding:0.01px 14px 0.01px 0.01px"><table cellpa=
dding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;width:65px"=
><tbody><tr><td style=3D"padding:0.01px 10px 0px 0px"><img src=3D"https://d=
36urhup7zbd7q.cloudfront.net/29e6c216-f94e-4bc3-8205-f3ea762db0d5/profile.f=
ormat_png.resize_200x.jpeg" height=3D"auto" width=3D"65" style=3D"width: 65=
px; vertical-align: initial; border-radius: 0px; display: block;"></td></tr=
></tbody></table></td><td height=3D"1" width=3D"0" style=3D"width:0px;paddi=
ng:0.01px;border-right:1px solid rgb(189,189,189);height:1px;font-size:1pt"=
>=C2=A0</td><td style=3D"padding:0.01px 0.01px 0.01px 14px;vertical-align:t=
op" valign=3D"top"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"bord=
er-collapse:collapse"><tbody><tr><td style=3D"line-height:1.2;padding:0.01p=
x 0.01px 12px"><span style=3D"font-family:Arial;text-transform:initial;font=
-weight:bold"><span style=3D"color:rgb(100,100,100);font-size:16px"> Sachin=
 Mamoru </span></span><br><span style=3D"font-size:13px;letter-spacing:0px;=
font-family:Arial;text-transform:initial;font-weight:bold;color:rgb(100,100=
,100)"> Software Engineer, </span> <span style=3D"font-size:13px;letter-spa=
cing:0px;font-family:Arial;text-transform:initial;font-weight:bold;color:rg=
b(100,100,100)"> WSO2</span></td></tr><tr><td style=3D"padding:0.01px;line-=
height:0"><table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collap=
se:collapse"><tbody><tr><td style=3D"padding:0.01px"><table cellpadding=3D"=
0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td styl=
e=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cell=
spacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-size:=
12px;font-family:Arial"><tbody><tr><td style=3D"padding:0.01px;font-family:=
Arial;font-size:12px"><a href=3D"tel:+94771292681" style=3D"text-decoration=
:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span style=3D"l=
ine-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:nowrap;fon=
t-size:12px"> +94771292681</span></a></td></tr></tbody></table></td><td sty=
le=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cel=
lspacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-size=
:12px;font-family:Arial"><tbody><tr><td style=3D"padding:0px 4px"><span sty=
le=3D"font-family:Arial;font-weight:bold;font-size:12px;color:rgb(33,33,33)=
;vertical-align:2px"> | </span></td><td style=3D"padding:0.01px;font-family=
:Arial;font-size:12px"><a href=3D"https://sachinmamoru.me/" style=3D"text-d=
ecoration:unset;font-size:12px;font-family:Arial" target=3D"_blank"><span s=
tyle=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;white-space:n=
owrap;font-size:12px"> sachinmamoru.me=C2=A0</span></a></td></tr></tbody></=
table></td></tr></tbody></table></td></tr><tr><td style=3D"padding:0.01px">=
<table cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collaps=
e"><tbody><tr><td style=3D"line-height:0;padding:0.01px 0.01px 6px"><table =
cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;line-=
height:14px;font-size:12px;font-family:Arial"><tbody><tr><td style=3D"paddi=
ng:0.01px;font-family:Arial;font-size:12px"><a href=3D"mailto:sachinmamoru@=
gmail.com" style=3D"text-decoration:unset;font-size:12px;font-family:Arial"=
 target=3D"_blank"><span style=3D"line-height:1.2;color:rgb(33,33,33);font-=
family:Arial;white-space:nowrap;font-size:12px"> sachinmamoru@gmail.com=C2=
=A0</span></a></td></tr></tbody></table></td></tr></tbody></table></td></tr=
></tbody></table></td></tr><tr><td style=3D"padding:12px 0.01px 0.01px"><ta=
ble cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;w=
idth:100%"><tbody><tr><td style=3D"padding:0.01px"><table border=3D"0" cell=
padding=3D"0" cellspacing=3D"0"><tbody><tr><td align=3D"left" style=3D"padd=
ing-right:6px;text-align:center;padding-top:0px"><a href=3D"https://www.lin=
kedin.com/in/sachin-mamoru/" target=3D"_blank"><img width=3D"25" height=3D"=
25" src=3D"https://cdn.gifo.wisestamp.com/s/ld/0077b5/50/0/background.png" =
style=3D"float: left; border: none;" border=3D"0"></a></td><td align=3D"lef=
t" style=3D"padding-right:6px;text-align:center;padding-top:0px"><a href=3D=
"https://twitter.com/MamoruSachin" target=3D"_blank"><img width=3D"25" heig=
ht=3D"25" src=3D"https://cdn.gifo.wisestamp.com/s/tw/55acee/50/0/background=
.png" style=3D"float: left; border: none;" border=3D"0"></a></td></tr></tbo=
dy></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></=
tbody></table><table cellpadding=3D"0" cellspacing=3D"0" border=3D"0" style=
=3D"max-width:600px;width:100%"><tbody><tr><td style=3D"line-height:0"></td=
></tr></tbody></table></td></tr></tbody></table><br></div><img src=3D"https=
://tracy.srv.wisestamp.com/px/5434123278745600.png" alt=3D""></div></div>
</div></blockquote></div><br></div></blockquote></div><br clear=3D"all"><di=
v><br></div><span class=3D"gmail_signature_prefix">-- </span><br><div dir=
=3D"ltr" class=3D"gmail_signature"><div dir=3D"ltr"><div dir=3D"ltr"><table=
 style=3D"direction:ltr;border-collapse:collapse"><tbody><tr><td style=3D"f=
ont-size:0px;height:12px;line-height:0"></td></tr><tr><td><table cellpaddin=
g=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;font-family:Ari=
al;line-height:1.15;color:rgb(0,0,0)"><tbody><tr><td style=3D"vertical-alig=
n:top;padding:0.01px 14px 0.01px 0.01px"><table cellpadding=3D"0" cellspaci=
ng=3D"0" style=3D"border-collapse:collapse;width:65px"><tbody><tr><td style=
=3D"padding:0.01px 10px 0px 0px"><img src=3D"https://d36urhup7zbd7q.cloudfr=
ont.net/29e6c216-f94e-4bc3-8205-f3ea762db0d5/profile.format_png.resize_200x=
.jpeg" height=3D"auto" width=3D"65" style=3D"width: 65px; vertical-align: i=
nitial; border-radius: 0px; display: block;"></td></tr></tbody></table></td=
><td height=3D"1" width=3D"0" style=3D"width:0px;padding:0.01px;border-righ=
t:1px solid rgb(189,189,189);height:1px;font-size:1pt">=C2=A0</td><td style=
=3D"padding:0.01px 0.01px 0.01px 14px;vertical-align:top" valign=3D"top"><t=
able cellpadding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse"=
><tbody><tr><td style=3D"line-height:1.2;padding:0.01px 0.01px 12px"><span =
style=3D"font-family:Arial;text-transform:initial;font-weight:bold"><span s=
tyle=3D"color:rgb(100,100,100);font-size:16px"> Sachin Mamoru </span></span=
><br><span style=3D"font-size:13px;letter-spacing:0px;font-family:Arial;tex=
t-transform:initial;font-weight:bold;color:rgb(100,100,100)"> Software Engi=
neer, </span> <span style=3D"font-size:13px;letter-spacing:0px;font-family:=
Arial;text-transform:initial;font-weight:bold;color:rgb(100,100,100)"> WSO2=
</span></td></tr><tr><td style=3D"padding:0.01px;line-height:0"><table cell=
padding=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><=
tr><td style=3D"padding:0.01px"><table cellpadding=3D"0" cellspacing=3D"0" =
style=3D"border-collapse:collapse"><tbody><tr><td style=3D"line-height:0;pa=
dding:0.01px 0.01px 6px"><table cellpadding=3D"0" cellspacing=3D"0" style=
=3D"border-collapse:collapse;line-height:14px;font-size:12px;font-family:Ar=
ial"><tbody><tr><td style=3D"padding:0.01px;font-family:Arial;font-size:12p=
x"><a href=3D"tel:+94771292681" style=3D"text-decoration:unset;font-size:12=
px;font-family:Arial" target=3D"_blank"><span style=3D"line-height:1.2;colo=
r:rgb(33,33,33);font-family:Arial;white-space:nowrap;font-size:12px"> +9477=
1292681</span></a></td></tr></tbody></table></td><td style=3D"line-height:0=
;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" cellspacing=3D"0" styl=
e=3D"border-collapse:collapse;line-height:14px;font-size:12px;font-family:A=
rial"><tbody><tr><td style=3D"padding:0px 4px"><span style=3D"font-family:A=
rial;font-weight:bold;font-size:12px;color:rgb(33,33,33);vertical-align:2px=
"> | </span></td><td style=3D"padding:0.01px;font-family:Arial;font-size:12=
px"><a href=3D"https://sachinmamoru.me" style=3D"text-decoration:unset;font=
-size:12px;font-family:Arial" target=3D"_blank"><span style=3D"line-height:=
1.2;color:rgb(33,33,33);font-family:Arial;white-space:nowrap;font-size:12px=
"> sachinmamoru.me=C2=A0</span></a></td></tr></tbody></table></td></tr></tb=
ody></table></td></tr><tr><td style=3D"padding:0.01px"><table cellpadding=
=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse"><tbody><tr><td =
style=3D"line-height:0;padding:0.01px 0.01px 6px"><table cellpadding=3D"0" =
cellspacing=3D"0" style=3D"border-collapse:collapse;line-height:14px;font-s=
ize:12px;font-family:Arial"><tbody><tr><td style=3D"padding:0.01px;font-fam=
ily:Arial;font-size:12px"><a href=3D"mailto:sachinmamoru@gmail.com" style=
=3D"text-decoration:unset;font-size:12px;font-family:Arial" target=3D"_blan=
k"><span style=3D"line-height:1.2;color:rgb(33,33,33);font-family:Arial;whi=
te-space:nowrap;font-size:12px"> sachinmamoru@gmail.com=C2=A0</span></a></t=
d></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>=
</td></tr><tr><td style=3D"padding:12px 0.01px 0.01px"><table cellpadding=
=3D"0" cellspacing=3D"0" style=3D"border-collapse:collapse;width:100%"><tbo=
dy><tr><td style=3D"padding:0.01px"><table border=3D"0" cellpadding=3D"0" c=
ellspacing=3D"0"><tbody><tr><td align=3D"left" style=3D"padding-right:6px;t=
ext-align:center;padding-top:0px"><a href=3D"https://www.linkedin.com/in/sa=
chin-mamoru/" target=3D"_blank"><img width=3D"25" height=3D"25" src=3D"http=
s://cdn.gifo.wisestamp.com/s/ld/0077b5/50/0/background.png" style=3D"float:=
 left; border: none;" border=3D"0"></a></td><td align=3D"left" style=3D"pad=
ding-right:6px;text-align:center;padding-top:0px"><a href=3D"https://twitte=
r.com/MamoruSachin" target=3D"_blank"><img width=3D"25" height=3D"25" src=
=3D"https://cdn.gifo.wisestamp.com/s/tw/55acee/50/0/background.png" style=
=3D"float: left; border: none;" border=3D"0"></a></td></tr></tbody></table>=
</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></tab=
le><table cellpadding=3D"0" cellspacing=3D"0" border=3D"0" style=3D"max-wid=
th:600px;width:100%"><tbody><tr><td style=3D"line-height:0"></td></tr></tbo=
dy></table></td></tr></tbody></table><br></div><img src=3D"https://tracy.sr=
v.wisestamp.com/px/5434123278745600.png" alt=3D""></div></div>

--000000000000be8ccb0611e1138c--

