RFC 8898

Third-Party Token-Based Authentication and Authorization for Session Initiation Protocol (SIP)

πŸ“… published September 2020, from ietf

RFC 8898 πŸŽ€ Third-Party Token-Based Authentication and Authorization for Session Initiation Protocol (SIP) πŸ’–

Okay bestie, the title block is giving us the essentials ✨ It's an Internet Engineering Task Force (IETF) document, and the authors are R. Shekh-Yusef (Auth0), C. Holmberg (Ericsson), and V. Pascual (Nokia). It's a Standards Track document, ISSN 2070-1721, dated September 2020, and it updates RFC 3261. The title block doesn't list anything it obsoletes. Request for Comments: 8898 πŸ¦‹

Abstract 🌸

This document defines the "Bearer" authentication scheme for the Session Initiation Protocol (SIP) 🧚 It also has a mechanism where user authentication and SIP registration authorization get delegated to a third party, using the OAuth 2.0 framework and OpenID Connect Core 1.0. πŸ” It updates RFC 3261 to give guidance on how a SIP User Agent Client (UAC) responds to a SIP 401/407 response that has multiple WWW-Authenticate/Proxy-Authenticate header fields. Literally so useful πŸ’…

Status of This Memo πŸ“œ

This is an Internet Standards Track document.

This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 7841.

Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at https://www.rfc-editor.org/info/rfc8898.

Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.

Table of Contents πŸ—‚οΈ

1.  Introduction
  1.1.  Terminology
  1.2.  Applicability
  1.3.  Token Types and Formats
  1.4.  Example Flows
    1.4.1.  Registration
    1.4.2.  Registration with Preconfigured AS
2.  SIP Procedures
  2.1.  UAC Behavior
    2.1.1.  Obtaining Tokens and Responding to Challenges
    2.1.2.  Protecting the Access Token
    2.1.3.  REGISTER Request
    2.1.4.  Non-REGISTER Request
  2.2.  User Agent Server (UAS) and Registrar Behavior
  2.3.  Proxy Behavior
3.  Access Token Claims
4.  WWW-Authenticate Response Header Field
5.  Security Considerations
6.  IANA Considerations
  6.1.  New Proxy-Authenticate Header Field Parameters
  6.2.  New WWW-Authenticate Header Field Parameters
7.  Normative References
8.  Informative References
Acknowledgments
Authors' Addresses

1. Introduction πŸ¦„

The Session Initiation Protocol (SIP) [RFC3261] uses the same framework as HTTP [RFC7230] to authenticate users. It's a simple challenge-response authentication mechanism: a SIP User Agent Server (UAS), proxy, or registrar can challenge a SIP User Agent Client (UAC) request, and the UAC can then provide authentication information in response to that challenge. Iconic design honestly πŸ‘‘

OAuth 2.0 [RFC6749] defines a token-based authorization framework that lets an OAuth client access resources on behalf of its user. πŸ”‘

The OpenID Connect Core 1.0 specification [OPENID] defines a simple identity layer on top of the OAuth 2.0 protocol. This lets OAuth/OpenID clients verify the identity of the user based on the authentication performed by a dedicated authorization server (AS), referred to as OpenID Provider (OP), and also get basic profile information about the user. πŸͺͺ

This document defines the "Bearer" authentication scheme for SIP and a mechanism where user authentication and SIP registration authorization get delegated to a third party, using the OAuth 2.0 framework and OpenID Connect Core 1.0. This kind of user authentication enables single sign-on, so the user authenticates once and gets access to both SIP and non-SIP services. No more logging in fifty times, bestie πŸ™Œ

This document also updates [RFC3261] by defining the UAC procedures for when a UAC receives a 401/407 response with multiple WWW-Authenticate/Proxy-Authenticate header fields, with challenges using different authentication schemes for the same realm. Main character energy 🌈

1.1. Terminology πŸ“–

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

1.2. Applicability 🎯

This document covers cases where grants that let the UAC get an access token from the AS are used. Cases where the UAC is not able to get an access token (for example, with an authorization code grant) are not covered. Not me saying "not covered" πŸ™ˆ

1.3. Token Types and Formats 🧁

The tokens used in third-party authorization depend on the type of AS.

An OAuth AS gives the following tokens to a successfully authorized UAC:

  • Access Token: The UAC uses this token to get access to services by providing the token to a SIP server.
  • Refresh Token: The UAC presents this token to the AS to refresh a stale access token.

An OP returns one more token:

  • ID Token: This token contains a SIP URI associated with the user, plus other user-specific details that the UAC will consume.

Tokens can come in two different formats:

  • Structured Token: A token made of a structured object that contains the claims associated with the token, for example a JSON Web Token (JWT), as defined in [RFC7519].
  • Reference Token: A token made of an opaque string that is used to get the details of the token and its associated claims, as defined in [RFC6746].

Wait, the original cites [RFC6749] here, so I need to keep that. Correcting:

  • Reference Token: A token made of an opaque string that is used to get the details of the token and its associated claims, as defined in [RFC6749].

Access tokens come in one of the two formats above. Refresh tokens are usually in a reference format, since only the AS that issued the token consumes it. The ID token is defined as a structured token in the form of a JWT. Lowkey the format logic is so clean πŸ’œ

1.4. Example Flows 🎬

1.4.1. Registration πŸ“²

Figure 1 below shows an example of a SIP registration where the registrar tells the UAC which AS it can get an access token from.

  UAC                         Registrar                         AS/OP
---------------------------------------------------------------------
  |                               |                               |
  | [1] REGISTER                  |                               |
  |------------------------------>|                               |
  |                               |                               |
  | [2] 401 Unauthorized          |                               |
  |     WWW-Authenticate: Bearer "authz_server"="<authz_server>"  |
  |<------------------------------|                               |
  |                               |                               |
  | [3] The UAC interacts with the AS and obtains tokens using    |
  |     some out-of-scope mechanism.                              |
  |<=============================================================>|
  |                               |                               |
  | [4] REGISTER                  |                               |
  |     Authorization: Bearer <access_token>                      |
  |------------------------------>|                               |
  |                               | [5] HTTP POST /introspect     |
  |                               |     {access_token}            |
  |                               |       (OPTIONAL)              |
  |                               |------------------------------>|
  |                               |                               |
  |                               | [6] 200 OK {metadata}         |
  |                               |       (OPTIONAL)              |
  |                               |<------------------------------|
  |                               |                               |
  | [7] 200 OK                    |                               |
  |<------------------------------|                               |
  |                               |                               |

Figure 1: Example Registration Flow πŸ—ΊοΈ

In step [1], the UAC kicks off the registration process by sending a SIP REGISTER request to the registrar with no credentials. πŸš€

In step [2], the registrar challenges the UA by sending a SIP 401 (Unauthorized) response to the REGISTER request. In that response, the registrar includes information about the AS to contact in order to get a token. πŸ™‹β€β™€οΈ

In step [3], the UAC interacts with the AS via an out-of-scope mechanism, potentially using the OAuth Native App mechanism defined in [RFC8252]. The AS authenticates the user and gives the UAC the tokens it needs to access the SIP service. πŸ”“

In step [4], the UAC retries the registration by sending a new REGISTER request that includes the access token it got in the step above. πŸ”

The registrar validates the access token. If the access token is a reference token, the registrar MAY perform an introspection [RFC7662], as in steps [5] and [6], in order to get more information about the access token and its scope, per [RFC7662]. Otherwise, after the registrar validates the token, it inspects its claims and acts upon them. πŸ”

In step [7], once the registrar has successfully verified and accepted the access token, it sends a 200 (OK) response to the REGISTER request. βœ…

1.4.2. Registration with Preconfigured AS πŸŽ€

Okay so Figure 2 shows a SIP registration where the UAC has already been preconfigured with info about which AS to grab its access token from πŸ¦‹

     UAC                         Registrar                         AS/OP
   ---------------------------------------------------------------------
     |                               |                               |
     | [1] The UAC interacts with the AS and obtains tokens using    |
     |     some out-of-scope mechanism.                              |
     |<=============================================================>|
     |                               |                               |
     | [2] REGISTER                  |                               |
     |     Authorization: Bearer <access_token>                      |
     |------------------------------>|                               |
     |                               | [3] HTTP POST /introspect     |
     |                               |     {access_token}            |
     |                               |       (OPTIONAL)              |
     |                               |------------------------------>|
     |                               |                               |
     |                               | [4] 200 OK {metadata}         |
     |                               |       (OPTIONAL)              |
     |                               |<------------------------------|
     |                               |                               |
     | [5] 200 OK                    |                               |
     |<------------------------------|                               |
     |                               |                               |

     Figure 2: Example Registration Flow - AS Information Preconfigured

In step [1], the UAC chats with the AS using some out-of-scope mechanism, potentially the OAuth Native App mechanism from [RFC8252] πŸ“± The AS authenticates the user and hands the UAC the tokens it needs to access the SIP service ✨

In step [2], the UAC kicks things off by sending a fresh REGISTER request that carries the access token it grabbed in the step above πŸ’Œ

The registrar validates the access token πŸ” If the access token is a reference token, the registrar MAY perform an introspection [RFC7662], as in steps [4] and [5], so it can learn more about the access token and its scope, per [RFC7662]. Otherwise, once the registrar validates the token, it inspects the claims and acts on them πŸ’…

In step [5], once the registrar has successfully verified and accepted the access token, it sends a 200 (OK) response to the REGISTER request. Bestie, that's a whole registration glow-up 🌈

2. SIP Procedures πŸ’…

Section 22 of [RFC3261] defines the SIP procedures for the Digest authentication mechanism πŸ” The same procedures apply to the "Bearer" authentication mechanism too, with the changes described in this section ✨

2.1. UAC Behavior 🌸

2.1.1. Obtaining Tokens and Responding to Challenges πŸ¦‹

So when a UAC sends a request without credentials (or with invalid ones), it could get back either a 401 (Unauthorized) response with a WWW-Authenticate header field, or a 407 (Proxy Authentication Required) response with a Proxy-Authenticate header field πŸ™ˆ If the WWW-Authenticate or Proxy-Authenticate header field indicates "Bearer" scheme authentication and contains an address to an AS, the UAC contacts the AS to get tokens and includes the requested scopes, based on a local configuration (Figure 1) πŸŽ€ The UAC MUST check the AS URL received in the 401/407 response against a list of trusted ASs configured on the UAC, so it can prevent several classes of possible vulnerabilities when a client blindly tries to use any AS it's handed. Not okay, so we don't do that 😀

The detailed OAuth2 procedure for authenticating the user and getting these tokens is out of scope for this document πŸ™…β€β™€οΈ The address of the AS might already be known to the UAC through configuration. In that case, the UAC can contact the AS for tokens before it sends a SIP request (Figure 2). Procedures for native applications are defined in [RFC8252]. When using the mechanism from [RFC8252], the user of the UAC gets directed to interact with the AS using a web browser, which lets the AS prompt the user for multi-factor authentication, redirect the user to third-party identity providers, and enable single sign-on sessions πŸ”‘βœ¨

The tokens returned to the UAC depend on the type of AS. An OAuth AS provides an access token and, optionally, a refresh token [RFC6749]. The refresh token is only used between the UAC and the AS 🀫 If the AS provides a refresh token to the UAC, the UAC uses it to request a new access token from the AS before the currently used access token expires ([RFC6749], Section 1.5). If the AS does not provide a refresh token, the UAC needs to reauthenticate the user to get a new access token before the currently used one expires 😭 An OP returns an additional ID token that contains claims about the user's authentication by an authorization server. The ID token can potentially include other optional claims about the user, e.g., the SIP URI, which the UAC will consume and later use to register with the registrar 🧚

If the UAC receives a 401/407 response with multiple WWW-Authenticate/Proxy-Authenticate header fields, offering challenges that use different authentication schemes for the same realm, the UAC provides credentials for one of the schemes it supports, based on local policy πŸ“

NOTE: At the time of writing, detailed procedures for the cases where a UAC receives multiple different authentication schemes had not been defined. A future specification might define such procedures.
NOTE: The address of the AS might be known to the UAC, e.g., using means of configuration, in which case the UAC can contact the AS in order to obtain the access token before it sends SIP request without credentials.

2.1.2. Protecting the Access Token πŸ”’

[RFC6749] mandates that access tokens are protected with TLS when in transit. However, SIP makes use of intermediary SIP proxies, and TLS only guarantees hop-to-hop protection when used to protect SIP signaling. So the access token MUST be protected in a way that only authorized SIP servers can access it 🚨 SIP endpoints that support this document MUST use encrypted JWTs [RFC7519] to encode and protect access tokens when they are included in SIP requests, unless some other mechanism is used to guarantee that only authorized SIP endpoints have access to the access token. TLS can still be used to protect traffic between SIP endpoints and the AS, as defined in [RFC6749] πŸ’œ

2.1.3. REGISTER Request πŸ“

The procedures in this section apply when the UAC has received a challenge that contains a "Bearer" scheme and the UAC has obtained a token, as specified in Section 2.1.1 πŸ¦‹

The UAC sends a REGISTER request with an Authorization header field containing the response to the challenge, including the "Bearer" scheme carrying a valid access token in the request, as specified in [RFC6750] πŸŽ€

Note that if there were multiple challenges with different schemes, the UAC may be able to successfully retry the request using non-"Bearer" credentials πŸ€·β€β™€οΈ

Typically, a UAC will obtain a new access token for each new binding. However, based on local policy, a UAC MAY include an access token that has been used for another binding associated with the same Address Of Record (AOR) in the request 🌸

If the access token included in a REGISTER request is not accepted and the UAC receives a 401 response or a 407 response, the UAC follows the procedures in Section 2.1.1 πŸ’…

2.1.4. Non-REGISTER Request πŸ“¨

The procedures in this section apply when the UAC has received a challenge that contains a "Bearer" scheme and the UAC has obtained a token, as specified in Section 2.1.1 ✨

When the UAC sends a request, it MUST include an Authorization header field with a "Bearer" scheme carrying a valid access token, obtained from the AS indicated in the challenge, in the request, as specified in [RFC6750]. Based on local policy, the UAC MAY include an access token that has been used for another dialog, or for another stand-alone request, if the target of the new request is the same 🧚

If the access token included in a request is not accepted and the UAC receives a 401 response or a 407 response, the UAC follows the procedures in Section 2.1.1 🫢

2.2. User Agent Server (UAS) and Registrar Behavior 🌈

When a UAS or registrar receives a request that fails to contain authorization credentials acceptable to it, the UAS/registrar SHOULD challenge the request by sending a 401 (Unauthorized) response πŸ™‹β€β™€οΈ If the UAS/registrar chooses to challenge the request and is willing to accept an access token as a credential, it MUST include a WWW-Authenticate header field in the response. That header indicates a "Bearer" scheme and includes an AS address, encoded as an https URI [RFC7230], where the UAC can get an access token πŸ”—

When a UAS or registrar receives a SIP request that contains an Authorization header field with an access token, the UAS/registrar MUST validate the access token using the procedures associated with the type of access token (structured or reference) used, e.g., [RFC7519] πŸ” If the token provided is an expired access token, then the UAS/registrar MUST reply with a 401 (Unauthorized) response, as defined in Section 3 of [RFC6750] ⏰ If the validation is successful, the UAS/registrar can carry on processing the request using normal SIP procedures πŸ₯³ If the validation fails, the UAS/registrar MUST reply with a 401 (Unauthorized) response πŸ™…β€β™€οΈ

2.3. Proxy Behavior πŸ¦‹

When a proxy receives a request that fails to contain authorization credentials acceptable to it, it SHOULD challenge the request by sending a 407 (Proxy Authentication Required) response. If the proxy chooses to challenge the request and is willing to accept an access token as a credential, it MUST include a Proxy-Authenticate header field in the response. That header indicates a "Bearer" scheme and includes an AS address, encoded as an https URI [RFC7230], where the UAC can get an access token πŸŽ€

When a proxy wants to authenticate a received request, it MUST search the request for Proxy-Authorization header fields with 'realm' parameters that match its realm. It then MUST successfully validate the credentials from at least one Proxy-Authorization header field for its realm. When the scheme is "Bearer", the proxy MUST validate the access token using the procedures associated with the type of access token (structured or reference) used, e.g., [RFC7519] πŸ›‘οΈ

3. Access Token Claims 🧚

The type of services an access token grants access to can be determined in different ways πŸ—οΈ The methods used, and the access the token provides, are based on local policy agreed between the AS and the registrar πŸ’œ

If an access token is encoded as a JWT, it will contain a list of claims [RFC7519], including both registered and application-specific claims. The registrar can grant access to services based on those claims, some other mechanism, or a combination of claims and some other mechanism. If an access token is a reference token, the registrar will grant access based on some other mechanism. Examples of such other mechanisms are introspection [RFC7662] and user profile lookups πŸ‘‘

4. WWW-Authenticate Response Header Field ✨

Okay, so this section uses ABNF [RFC5234] to describe how the WWW-Authenticate header field looks when it's used with the "Bearer" scheme πŸŽ€ It's basically how a registrar or proxy challenges the UAC for credentials, by extending the 'challenge' parameter that [RFC3261] already defined. Here's the grammar, bestie πŸ’…

challenge  =/  ("Bearer" LWS bearer-cln *(COMMA bearer-cln))
bearer-cln = realm / scope-param / authz-server-param / error-param /
             auth-param
realm = <defined in RFC 3261>
scope-param = "scope" EQUAL DQUOTE scope DQUOTE
scope = <defined in RFC 6749>
authz-server-param = "authz_server" EQUAL DQUOTE authz-server DQUOTE
authz-server = https-URI
https-URI = <defined in RFC 7230>
error-param = "error" EQUAL DQUOTE error DQUOTE
error = <defined in RFC 6749>
auth-param = <defined in RFC 3261>

                   Figure 3: "Bearer" Scheme Syntax

The authz_server parameter holds the HTTPS URI of the AS, which is defined in [RFC7230] 🌸 The UAC can look up metadata about the AS using a mechanism like the one in [RFC8414], which is so useful!! πŸ”₯

The realm and auth-param parameters both come from [RFC3261] πŸ¦‹

Per [RFC3261], "the realm string alone defines the protection domain". Now, [RFC3261] says the realm string must be globally unique, and it recommends that the realm string contain a hostname or domain name. It also says the realm string should be a human-readable identifier that can be shown to the user πŸ‘‘

The scope and error parameters are defined in [RFC6749] ⭐

So the scope parameter is how the registrar or proxy can tell the UAC the minimum scope that has to be attached to the access token for the UAC to get service 🧚 As [RFC6749] defines, the scope value is a list of space-delimited, case-sensitive strings. The AS defines those strings, and the values themselves are out of scope for this document, so we're not going there πŸ™ˆ The UAC then uses the scope the registrar gave it to contact the AS and get a proper token with that scope. Main character energy for the handshake ✨

The error parameter can be used by the registrar or proxy to tell the UAC why things went wrong. The possible values are "invalid_token" or "invalid_scope" πŸ’€


5. Security Considerations πŸ”

Okay, bestie, this section is SERIOUS, so let's get into it 😭 The security considerations for OAuth are defined in [RFC6749]. The security considerations for "Bearer" tokens are defined in [RFC6750]. The security considerations for JWTs are defined in [RFC7519]. All of these also apply to SIP usage of access tokens, as this document defines it πŸ’œ

Now, [RFC6749] says access tokens must be protected with TLS while they're in transit. BUT, SIP uses intermediary SIP proxies, and TLS only gives you hop-to-hop protection when it's protecting SIP signaling. So the access token MUST be protected in a way that only authorized SIP servers can get to it. SIP endpoints that support this document MUST use encrypted JWTs [RFC7519] to encode and protect access tokens when they're included in SIP requests, unless some other mechanism is used to make sure only authorized SIP endpoints can access the token. TLS can still be used to protect traffic between SIP endpoints and the AS, as [RFC6749] defines 🫢

Encrypted JWTs are a MUST here, not a maybe. Don't let your access tokens wander around the proxy chain in plain text, periodt 😀

Single Sign-On (SSO) lets the user use one set of credentials to authenticate once and get access to multiple SIP and non-SIP services with access token(s). Cute for convenience, but if the SSO login gets compromised, that one single point of compromise has a much bigger effect than it would without SSO. Even worse, an attacker can often use a compromised account to set up Single Sign-On for other services the victim never signed up for, and sometimes they can even flip a dedicated account into SSO mode, which makes the attack even broader πŸ’€

Because of all that, it's critical to make sure extra security measures are taken to protect the credentials used for SSO. Examples include a long passphrase instead of a password, turning on multi-factor authentication, and using the native platform browser when possible, as [RFC8252] defines πŸ”₯

This is out of scope for this document, but it's still important to think carefully about the claims in the tokens used to access these services, so the user's privacy is protected while they're using them. Like we said above, this document calls for encrypting the JWTs that represent the access token πŸ¦‹

It's really important that both parties in SSO give users a way to sever the SSO relationship. That way, it's possible to fix a compromise that's already happened without undue difficulty 🌈

The operator of an SSO authentication system has access to private information about the sites and services their users log into, and even, to some extent, their usage patterns. It's important to call these out in privacy disclosures and policies, and to make sure users can understand the trade-offs between convenience and privacy when they choose to use SSO 🌸

When a registrar chooses to challenge a REGISTER request, and it can provide access to different levels of service, it is RECOMMENDED that the registrar include a scope in the response to show the minimum scope needed to register and access basic services. The access token might include an extended scope that gives the user access to more advanced features beyond basic services. In SIP, the AS administrator usually decides what level of access a given user gets πŸ‘‘

The UAC MUST check the AS URL it receives in the 401/407 response against a list of trusted ASs configured on the UAC. This is how it prevents several classes of possible vulnerabilities that happen when a client blindly tries to use any AS it's handed πŸ™…β€β™€οΈ


6. IANA Considerations πŸ“‹

6.1. New Proxy-Authenticate Header Field Parameters

This section defines new SIP header field parameters in the "Header Field Parameters and Parameter Values" subregistry of the "Session Initiation Protocol (SIP) Parameters" registry: https://www.iana.org/assignments/sip-parameters πŸŽ€

        +================+===================+===========+
        | Parameter Name | Predefined Values | Reference |
        +================+===================+===========+
        | authz_server   | No                | RFC 8898  |
        +----------------+-------------------+-----------+
        | error          | No                | RFC 8898  |
        +----------------+-------------------+-----------+
        | scope          | No                | RFC 8898  |
        +----------------+-------------------+-----------+

            Table 1: Header Field: Proxy-Authenticate

6.2. New WWW-Authenticate Header Field Parameters

This section defines new SIP header field parameters in the "Header Field Parameters and Parameter Values" subregistry of the "Session Initiation Protocol (SIP) Parameters" registry: https://www.iana.org/assignments/sip-parameters 🧚

        +================+===================+===========+
        | Parameter Name | Predefined Values | Reference |
        +================+===================+===========+
        | authz_server   | No                | RFC 8898  |
        +----------------+-------------------+-----------+
        | error          | No                | RFC 8898  |
        +----------------+-------------------+-----------+
        | scope          | No                | RFC 8898  |
        +----------------+-------------------+-----------+

             Table 2: Header Field: WWW-Authenticate

7. Normative References πŸ“š


8. Informative References 🧠


Acknowledgments πŸ’–

The authors would like to specially thank Paul Kyzivat for his multiple detailed reviews and suggested text that significantly improved the quality of the document 🌟

The authors would also like to thank the following for their review and feedback on this document: Olle Johansson, Roman Shpount, Dale Worley, and Jorgen Axell 🫢

The authors would also like to thank the following for their review and feedback of the original document that was replaced with this document: Andrew Allen, Martin Dolly, Keith Drage, Paul Kyzivat, Jon Peterson, Michael Procter, Roy Radhika, Matt Ryan, Ivo Sedlacek, Roman Shpount, Robert Sparks, Asveren Tolga, Dale Worley, and Yehoshua Gev 🌸

Roman Danyliw, Benjamin Kaduk, Erik Kline, Barry Leiba, Eric Vyncke, and Magnus Westerlund provided feedback and suggestions for improvements as part of the IESG evaluation of the document. Special thanks to Benjamin Kaduk for his detailed and comprehensive reviews and comments πŸ‘‘

The authors would also like to specially thank Jean Mahoney for her multiple reviews, editorial help, and the conversion of the XML source file from v2 to v3 πŸŽ€

Authors' Addresses πŸŽ€

Rifaat Shekh-Yusef πŸ’… Auth0 Ottawa Ontario Canada Email: rifaat.s.ietf@gmail.com ✨

Christer Holmberg πŸ¦‹ Ericsson Hirsalantie 11 FI-02420 Jorvas Finland Email: christer.holmberg@ericsson.com 🌸

Victor Pascual 🧚 Nokia Barcelona Spain Email: victor.pascual_avila@nokia.com πŸ’œ

πŸ“¦ where this page comes from