<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Documentation – Check-in</title><link>/providers/check-in/</link><description>Recent content in Check-in on Documentation</description><generator>Hugo -- gohugo.io</generator><atom:link href="/providers/check-in/index.xml" rel="self" type="application/rss+xml"/><item><title>Providers: Identity Providers</title><link>/providers/check-in/idp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/check-in/idp/</guid><description>
&lt;p>This page contains information about integrating your identity provider (IdP)
with &lt;a href="https://www.egi.eu/service/check-in/">Check-in&lt;/a> in order to allow users
in your community to access EGI tools and services.&lt;/p>
&lt;p>Organisations who want to register their IdP in Check-in needs to fill this
&lt;a href="https://documents.egi.eu/document/3086">form&lt;/a> in case the IdP is not publishing
REFEDS &lt;a href="https://refeds.org/category/research-and-scholarship">R&amp;amp;S&lt;/a> and
&lt;a href="https://refeds.org/sirtfi">Sirtfi&lt;/a> compliance in eduGAIN. A PDF scan of a
printed and signed copy should be sent to &lt;code>operations_at_egi.eu&lt;/code>&lt;/p>
&lt;h2 id="identity-provider-integration-workflow">Identity Provider integration workflow&lt;/h2>
&lt;p>To integrate your Identity Provider with the EGI Check-in service, you need to
submit a &lt;a href="https://helpdesk.ggus.eu">GGUS&lt;/a> ticket indicating your request.
The responsible support unit is
&lt;a href="https://confluence.egi.eu/display/EGIPP/GGUS%3A+Check-in+%28AAI%29+FAQ">AAI Support&lt;/a>.
The integration follows a two-step process:&lt;/p>
&lt;ol>
&lt;li>Register your Identity Provider and test integration with the development
instance of EGI Check-in. The development instance allows for testing
authentication and authorisation to EGI services and resources without
affecting the production environment of EGI. Note that the development
instance is not connected to the production service and no information is
shared between the two systems.&lt;/li>
&lt;li>Register your Identity Provider with the production instance of EGI Check-in
to allow members of your Community to access production EGI services and
resources protected by Check-in. This requires that your Identity Provider
meets all the &lt;a href="https://documents.egi.eu/document/3086">policy requirements&lt;/a>
and that integration has been thoroughly tested during Step 1.&lt;/li>
&lt;/ol>
&lt;p>The most important URLs for each environment are listed in the table below but
more information can be found in the protocol-specific sections that follow.&lt;/p>
&lt;!-- markdownlint-disable line-length -->
&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-0-0-tab" data-toggle="tab" href="#tabs-0-0" role="tab"
aria-controls="tabs-0-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-0-1-tab" data-toggle="tab" href="#tabs-0-1" role="tab"
aria-controls="tabs-0-1" aria-selected="false">
Demo
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-0-2-tab" data-toggle="tab" href="#tabs-0-2" role="tab"
aria-controls="tabs-0-2" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-0-content">
&lt;div class="tab-pane show active"
id="tabs-0-0" role="tabpanel" aria-labelled-by="tabs-0-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>See &lt;a href="#client-registration">client registration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-0-1" role="tabpanel" aria-labelled-by="tabs-0-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Demo environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai-demo.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>See &lt;a href="#client-registration">client registration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-0-2" role="tabpanel" aria-labelled-by="tabs-0-2-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai-dev.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>See &lt;a href="#client-registration">client registration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- markdownlint-enable line-length -->
&lt;h2 id="general-requirements-for-integrating-identity-providers">General requirements for integrating identity providers&lt;/h2>
&lt;p>An institution or a community may connect their IdP with Check-in to allow their
users to access EGI services, or any other services that have enabled Check-in
as an authentication provider. This section presents the general requirements
for integrating an IdP with EGI Check-in, while protocol-specific instructions
are provided in the sections that follow.&lt;/p>
&lt;h3 id="attribute-release-requirements">Attribute release requirements&lt;/h3>
&lt;p>As a bare minimum, the IdP of a user&amp;rsquo;s Home Organisation or Community is
expected to release a non-reassignable identifier that uniquely identifies the
user within the scope of that organisation or community. The unique identifier
must be accompanied with a minimum set of attributes which the Check-in Service
Provider Proxy will attempt to retrieve from the user&amp;rsquo;s IdP. If this is not
possible, the missing user attributes will be acquired and verified through the
user registration process with the EGI Account Registry. The following table
describes the data requested from the user&amp;rsquo;s Home Organisation, which are
communicated to the Check-in SP as either SAML attributes or OIDC claims,
depending on the protocol supported by the authenticating IdP.&lt;/p>
&lt;!-- markdownlint-disable line-length no-inline-html -->
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Description&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>At least one of the following unique user identifiers:&lt;ol>&lt;li>pseudonymous, non-targeted identifier;&lt;/li>&lt;li>name-based, non-targeted identifier;&lt;/li>&lt;li>pseudonymous, targeted identifier&lt;/li>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Preferred name for display purposes&lt;/td>
&lt;td>For example to be used in a greeting or a descriptive listing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>First name&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Surname&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Email address&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Affiliation within Home Organisation or Community&lt;/td>
&lt;td>To be released &lt;strong>only&lt;/strong> if relevant for accessing EGI services&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- markdownlint-enable line-length no-inline-html -->
&lt;p>Note that the above set of requested attributes, particularly the identifier,
name, email and affiliation information, complies with the
&lt;a href="https://refeds.org/category/research-and-scholarship">REFEDS R&amp;amp;S attribute bundle&lt;/a>.&lt;/p>
&lt;p>Information about group membership and role information released by your IdP
should follow the URN scheme below (see also
&lt;a href="https://aarc-community.org/guidelines/aarc-g002">AARC-G002&lt;/a>):&lt;/p>
&lt;pre>&lt;code>&amp;lt;NAMESPACE&amp;gt;:group:&amp;lt;GROUP&amp;gt;[:&amp;lt;SUBGROUP&amp;gt;*][:role=&amp;lt;ROLE&amp;gt;]#&amp;lt;GROUP-AUTHORITY&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;NAMESPACE&amp;gt;&lt;/code> is in the form of
&lt;code>urn:&amp;lt;NID&amp;gt;:&amp;lt;DELEGATED-NAMESPACE&amp;gt;[:&amp;lt;SUBNAMESPACE&amp;gt;*]&lt;/code>, where
&lt;ul>
&lt;li>&lt;code>&amp;lt;NID&amp;gt;&lt;/code> is the namespace identifier associated with a URN namespace
registered with
&lt;a href="https://www.iana.org/assignments/urn-namespaces/urn-namespaces.xhtml">IANA&lt;/a>,
as per RFC8141, ensuring global uniqueness. Implementers can and should use
one of the existing registered URN namespaces, such as
&lt;a href="https://wiki.geant.org/display/URN/URN+Namespace+Delegated+to+Other+Entities">&lt;code>urn:geant&lt;/code>&lt;/a>
and
&lt;a href="https://incommon.org/community/mace-registries/mace-urn-registry/">&lt;code>urn:mace&lt;/code>&lt;/a>;&lt;/li>
&lt;li>&lt;code>&amp;lt;DELEGATED-NAMESPACE&amp;gt;&lt;/code> is a URN sub-namespace delegated from one of the
IANA registered NIDs&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>to an organisation representing the e-infrastructure, research infrastructure or
research collaboration.&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;GROUP&amp;gt;&lt;/code> is the name of a VO, research collaboration or a top level arbitrary
group. &lt;code>&amp;lt;GROUP&amp;gt;&lt;/code> names are unique within the &lt;code>urn:mace:egi.eu:group&lt;/code>
namespace;&lt;/li>
&lt;li>zero or more &lt;code>&amp;lt;SUBGROUP&amp;gt;&lt;/code> components represent the hierarchy of subgroups in
the &lt;code>&amp;lt;GROUP&amp;gt;&lt;/code>; specifying sub-groups is optional&lt;/li>
&lt;li>the optional &lt;code>&amp;lt;ROLE&amp;gt;&lt;/code> component is scoped to the rightmost (sub)group; if no
group information is specified, the role applies to the VO&lt;/li>
&lt;li>&lt;code>&amp;lt;GROUP-AUTHORITY&amp;gt;&lt;/code> is a non-empty string that indicates the authoritative
source for the entitlement value. For example, it can be the FQDN of the group
management system that is responsible for the identified group membership
information&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example entitlement values expressing VO/group membership and role
information:&lt;/strong>&lt;/p>
&lt;pre>&lt;code>urn:geant:dariah.eu:group:egi-interop:role=member#aaiproxy.de.dariah.eu
urn:geant:dariah.eu:group:egi-interop:role=vm_operator#aaiproxy.de.dariah.eu
&lt;/code>&lt;/pre>
&lt;h3 id="operational-and-security-requirements">Operational and security requirements&lt;/h3>
&lt;p>The IdP needs to comply with additional requirements to achieve a higher level
of assurance and allow its users to gain access to a wider set of EGI services.
A first group of additional requirements are defined by the
&lt;a href="https://refeds.org/wp-content/uploads/2016/01/Sirtfi-1.0.pdf">Sirtfi framework v1.0&lt;/a>.
Adherence to these requirements can be asserted either by publishing Sirtfi
compliance in the eduGAIN metadata or by declaring it in this
&lt;a href="https://documents.egi.eu/document/3086">form&lt;/a>. These requirements are in the
areas of operational security, incident response, traceability and IdPs and
users responsibility.&lt;/p>
&lt;h3 id="branding-requirements">Branding requirements&lt;/h3>
&lt;p>Check-in provides a central Discovery Service (or &amp;ldquo;Where Are You From&amp;rdquo; - WAYF)
page where users in your Home Organisation or Community will be automatically
redirected when necessary to select to authenticate at your IdP. You can provide
us with a logo of your Organisation or Community (in high-res PNG or preferably
in svg format) to include a dedicated login button that will allow users to
easily identify your IdP.&lt;/p>
&lt;h2 id="saml-identity-provider">SAML Identity Provider&lt;/h2>
&lt;p>To allow users in your community to sign into federated EGI applications, you
need to connect to the EGI AAI SP Proxy as a SAML Identity Provider (IdP). Users
of the application will be redirected to the central Discovery Service page of
the EGI AAI Proxy where they will able to select to authenticate at your IdP.
Once the user is authenticated, the EGI AAI Proxy will return a SAML assertion
to the application containing the information returned by your IdP about the
authenticated user.&lt;/p>
&lt;h3 id="metadata-registration">Metadata registration&lt;/h3>
&lt;p>SAML authentication relies on the use of metadata. Both parties (you as an IdP
and the EGI AAI SP) need to exchange metadata in order to know and trust each
other. The metadata include information such as the location of the service
endpoints that need to be invoked, as well as the certificates that will be used
to sign SAML messages. The format of the exchanged metadata should be based on
the XML-based
&lt;a href="https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf">SAML 2.0 specification&lt;/a>.
Usually, you will not need to manually create such an XML document, as this is
automatically generated by all major SAML 2.0 IdP software solutions (e.g.,
Shibboleth, SimpleSAMLphp). It is important that you serve your metadata over
HTTPS using a browser-friendly SSL certificate, i.e. issued by a trusted
certificate authority.&lt;/p>
&lt;p>To exchange metadata, please send an email including the following information:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>entityID&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Metadata URL&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>Depending on the software you are using, the authoritative XML metadata URL for
your IdP might be in the following form:&lt;/p>
&lt;ul>
&lt;li>&lt;code>https://your.idp.example.eu/idp/shibboleth&lt;/code> (Shibboleth)&lt;/li>
&lt;li>&lt;code>https://your.idp.example.eu/simplesaml/module.php/saml2/idp/metadata.php&lt;/code>
(SimpleSAMLphp)&lt;/li>
&lt;/ul>
&lt;p>Note that if your IdP is part of a federation, then it would be preferred to
send us the URL to a signed federation metadata aggregate. We can then cherry
pick the appropriate entityID from that.&lt;/p>
&lt;p>You can get the metadata of the EGI Check-in SP Proxy on a dedicated URL that
depends on the integration environment being used:&lt;/p>
&lt;!-- markdownlint-disable line-length -->
&lt;ul class="nav nav-tabs" id="tabs-1" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-1-0-tab" data-toggle="tab" href="#tabs-1-0" role="tab"
aria-controls="tabs-1-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-1-1-tab" data-toggle="tab" href="#tabs-1-1" role="tab"
aria-controls="tabs-1-1" aria-selected="false">
Demo
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-1-2-tab" data-toggle="tab" href="#tabs-1-2" role="tab"
aria-controls="tabs-1-2" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-1-content">
&lt;div class="tab-pane show active"
id="tabs-1-0" role="tabpanel" aria-labelled-by="tabs-1-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-1-1" role="tabpanel" aria-labelled-by="tabs-1-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Demo environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="https://aai-demo.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai-demo.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-1-2" role="tabpanel" aria-labelled-by="tabs-1-2-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="https://aai-dev.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">https://aai-dev.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- markdownlint-enable line-length -->
&lt;p>For the production environment, it is recommended that you get the metadata for
the EGI Check-in SP (entityID:
&lt;a href="https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso">&lt;code>https://aai.egi.eu/proxy/module.php/saml/sp/metadata.php/sso&lt;/code>&lt;/a>)
from a signed eduGAIN metadata aggregate. For example, the following aggregates
are provided by GRNET:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://md.aai.grnet.gr/aggregates/grnet-metadata.xml">GRNET federation's metadata&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://md.aai.grnet.gr/feeds/edugain-sp-samlmd.xml">eduGAIN SP metadata&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="attribute-release">Attribute release&lt;/h3>
&lt;!--
// jscpd:ignore-start
-->
&lt;p>The SAML based Identity Provider of your Home Organisation or Community is
expected to release a non-reassignable identifier that uniquely identifies the
user within the scope of that organisation or community, along with a set of
additional information as described in the following table (see also
&lt;a href="#attribute-release-requirements">general attribute release requirements&lt;/a>):&lt;/p>
&lt;!-- markdownlint-disable line-length no-inline-html -->
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Description&lt;/th>
&lt;th>SAML attribute&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>At least one of the following unique user identifiers:&lt;ol>&lt;li>pseudonymous, non-targeted identifier;&lt;/li>&lt;li>name-based, non-targeted identifier;&lt;/li>&lt;li>pseudonymous, targeted identifier&lt;/li>&lt;/td>
&lt;td>&lt;ol>&lt;li>&lt;code>SubjectID&lt;/code> (public) or &lt;code>eduPersonUniqueId&lt;/code>&lt;/li>&lt;li>&lt;code>eduPersonPrincipalName&lt;/code>&lt;/li>&lt;li>&lt;code>SubjectID&lt;/code> (pairwise) or &lt;code>eduPersonTargetedID&lt;/code> or SAML persistent identifier&lt;/li>&lt;/ol>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Preferred name for display purposes&lt;/td>
&lt;td>&lt;code>displayName&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>First name&lt;/td>
&lt;td>&lt;code>givenName&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Surname&lt;/td>
&lt;td>&lt;code>sn&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Email address&lt;/td>
&lt;td>&lt;code>mail&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Affiliation within Home Organisation or Community&lt;/td>
&lt;td>&lt;code>eduPersonScopedAffiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Group(s)/role(s) within Home Organisation or Community&lt;/td>
&lt;td>&lt;code>eduPersonEntitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- markdownlint-enable line-length no-inline-html -->
&lt;!--
// jscpd:ignore-end
-->
&lt;h2 id="openid-connect-identity-provider">OpenID Connect Identity Provider&lt;/h2>
&lt;p>Users in your community can sign into federated EGI applications through the
Check-in service using your OpenID Connect or OAuth 2.0 based Identity Provider.&lt;/p>
&lt;h3 id="client-registration">Client registration&lt;/h3>
&lt;p>To enable your OIDC Identity Provider for user login, Check-in needs to be
registered as a client in order to obtain OAuth 2.0 credentials, such as a
client ID and client secret, and to register one or more redirect URIs. Once
Check-in is registered as a client, your users will be redirected to the central
Discovery Service page of Check-in when logging into EGI federated applications,
where they will able to select to authenticate at your IdP. Once the user is
authenticated, Check-in will be responsible for communicating the information
returned by your IdP about the authenticated user to the connected application.
Depending on the protocol, this information will be expressed through a SAML
assertion, a set of OIDC claims or a (proxy) X.509 certificate.&lt;/p>
&lt;h3 id="provider-configuration">Provider configuration&lt;/h3>
&lt;p>Check-in needs to obtain your OpenID Provider's configuration information,
including the location of the Authorisation, Token and UserInfo endpoints. Your
OpenID Provider is expected to make a JSON document available at the path formed
by concatenating the string &lt;code>/.well-known/openid-configuration&lt;/code> to the Issuer,
following the
&lt;a href="https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig">OpenID Connect Discovery 1.0 specification&lt;/a>.&lt;/p>
&lt;h3 id="attribute-release-1">Attribute release&lt;/h3>
&lt;!--
// jscpd:ignore-start
-->
&lt;p>The OpenID Connect or OAuth 2.0 based Identity Provider of your Home
Organisation or Community is expected to release a non-reassignable identifier
that uniquely identifies the user within the scope of that organisation or
community, along with a set of additional information as described in the
following table (see also
&lt;a href="#attribute-release-requirements">general attribute release requirements&lt;/a>):&lt;/p>
&lt;!-- markdownlint-disable line-length no-inline-html -->
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Description&lt;/th>
&lt;th>OIDC claim&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>At least one of the following unique user identifiers:&lt;ol>&lt;li>pseudonymous, non-targeted identifier;&lt;/li>&lt;li>name-based, non-targeted identifier;&lt;/li>&lt;li>pseudonymous, targeted identifier&lt;/li>&lt;/td>
&lt;td>&lt;ol>&lt;li>&lt;code>sub&lt;/code> (public)&lt;/li>&lt;li>N/A&lt;/li>&lt;li>&lt;code>sub&lt;/code> (pairwise)&lt;/li>&lt;/ol>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Preferred name for display purposes&lt;/td>
&lt;td>&lt;code>name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>First name&lt;/td>
&lt;td>&lt;code>given_name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Surname&lt;/td>
&lt;td>&lt;code>family_name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Email address&lt;/td>
&lt;td>&lt;code>email&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Affiliation within Home Organisation or Community&lt;/td>
&lt;td>&lt;code>eduperson_scoped_affiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Group(s)/role(s) within Home Organisation or Community&lt;/td>
&lt;td>&lt;code>eduPerson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- markdownlint-enable line-length no-inline-html -->
&lt;!--
// jscpd:ignore-end
--></description></item><item><title>Providers: Service Providers</title><link>/providers/check-in/sp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/check-in/sp/</guid><description>
&lt;p>This page contains information about connecting services to
&lt;a href="https://www.egi.eu/service/check-in/">EGI Check-in&lt;/a> in order to allow user
login through Check-in and to receive users&amp;rsquo; attributes. Check-in is connected
to a wide range of academic and social Identity Providers that users can choose
from in order to access your service.&lt;/p>
&lt;h2 id="services-eligible-for-integration">Services eligible for integration&lt;/h2>
&lt;p>EGI Operations, as owner of the Check-in service, must approve every request for
integration of new services with Check-in. The approval (or non-approval) is
based on some prerequisites, the relevance of the service for the EGI community
and the available resources to support the integration. The prerequisites are
described in the following sections.&lt;/p>
&lt;p>&lt;strong>EGI at any time can prevent a service provider to access the Check-in
service&lt;/strong>&lt;/p>
&lt;h3 id="services-federated-in-egi">Services federated in EGI&lt;/h3>
&lt;p>All the services that are operated by Resource Providers federated in EGI
federation and that abide to the RC OLA, and consequently to the relevant
security policies of EGI, can be connected with Check-in. Fulfilling all the
relevant EGI policies makes the service eligible in receiving attributes
released by Check-in.&lt;/p>
&lt;h3 id="services-not-federated-in-egi">Services not federated in EGI&lt;/h3>
&lt;p>A service not part of the EGI federation can be integrated with Check-in if the
organisation providing the service complies with the EGI security requirements
relevant to the service providers.&lt;/p>
&lt;p>By accepting the policies a service provider assures that they will operate the
service in good faith, without deliberately exposing the user to security risks,
without claiming intellectual property on the data owned by the user, and
protecting sensitive data generated by the interaction of the user with the
service.&lt;/p>
&lt;p>The policies that the service provider will have to accept are available in the
&lt;a href="https://go.egi.eu/policies-and-procedures">EGI Policies and procedures page&lt;/a>
and specifically are:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://documents.egi.eu/document/3015">EGI Security Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://documents.egi.eu/document/3601">Service Operations Security Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://documents.egi.eu/document/2934">Traceability and Logging Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://documents.egi.eu/document/2935">Security Incident Response Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://documents.egi.eu/document/2732">Policy on the Processing of Personal Data&lt;/a>&lt;/li>
&lt;/ol>
&lt;h2 id="service-provider-integration-workflow">Service Provider integration workflow&lt;/h2>
&lt;p>To integrate your Service Provider with the EGI Check-in service, you need to
create a registration request using the
&lt;a href="https://aai.egi.eu/federation">EGI Federation Registry Portal&lt;/a>. You can also
use the Federation Registry portal to request the reconfiguration or
deregistration of an existing deployed service. Service registration requests
typically require approval by an administrator. Please refer to the
&lt;a href="https://federation.rciam.grnet.gr/docs">Federation Registry Documentation&lt;/a> for
more information.&lt;/p>
&lt;p>The integration follows a two-step process:&lt;/p>
&lt;ol>
&lt;li>Register your Service Provider and test integration with the &lt;strong>demo&lt;/strong>
instance of EGI Check-in by selecting the &amp;ldquo;Demo&amp;rdquo; integration environment
during registration through the EGI Federation Registry Portal. Service
registration requests require approval by an administrator. The review
process for the demo environment involves primarily the technical aspects of
the service configuration. However, moving the service to production requires
compliance with all the
&lt;a href="#services-eligible-for-integration">eligibility criteria&lt;/a> (see Step 2). The
demo instance allows for testing authentication and authorisation through the
academic and social Identity Providers connected to Check-in without
affecting the production Check-in service. Note that while the demo instance
has identical functionality to the production instance, no information is
shared between the two systems.
&lt;ul>
&lt;li>You can also test new features of Check-in that are not available in
production yet, by registering your Service Provider and testing
integration with the &lt;strong>development&lt;/strong> instance of Check-in. In the
development instance service requests can be self-reviewed without the need
to wait for approval from an administrator. As with the demo instance, the
development instance allows for testing authentication and authorisation
without affecting the production Check-in service. &lt;strong>NB: The development
environment is intended for testing the latest features of Check-in and
may differ from the demo and production environments in terms of stability
and functionality.
Keep in mind that the supported Identity Providers in the development
instance are limited.
Therefore, we recommend using any of the social identity providers or the
&lt;a href="https://sso.egi.eu/admin/">EGI SSO&lt;/a> to test the login workflow when using
the development instance.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Register your Service Provider with the &lt;strong>production&lt;/strong> instance of EGI
Check-in by selecting the &amp;ldquo;Production&amp;rdquo; integration environment during
registration through the EGI Federation Registry Portal. The production
instance allows access to your service through the academic and social
Identity Providers connected to Check-in. This requires that your service
meets all the &lt;a href="#services-eligible-for-integration">eligibility criteria&lt;/a> and
that integration has been thoroughly tested during Step 1.&lt;/li>
&lt;/ol>
&lt;h2 id="general-information">General Information&lt;/h2>
&lt;p>EGI Check-in supports two authentication and authorisation protocols that you
can choose from:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html">Security Assertion Markup Language (SAML) 2.0&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://openid.net/specs/openid-connect-core-1_0.html">OpenID Connect&lt;/a> - an
extension to &lt;a href="https://tools.ietf.org/html/rfc6749">OAuth 2.0&lt;/a>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Service providers should ensure that a proper authorisation model is put in
place: if &lt;a href="#identity-assurance">low assurance&lt;/a> accounts, like those coming
from social media identity providers, are granted access without any vetting,
it may lead to an abuse of their service.&lt;/p>
&lt;/blockquote>
&lt;p>Regardless of which of the two protocols you are going to use, you need to
provide the following information to connect your service to EGI Check-in:&lt;/p>
&lt;ol>
&lt;li>Name of the service (in English and optionally in other languages supported
by the service)&lt;/li>
&lt;li>Short description of the service&lt;/li>
&lt;li>Site (URL) for localised information about the service; the content found at
the URL SHOULD provide more complete information than what provided by the
description&lt;/li>
&lt;li>Contact information of the following types:
&lt;ul>
&lt;li>Helpdesk/Support contact information (for redirecting user)&lt;/li>
&lt;li>Administrative&lt;/li>
&lt;li>Technical&lt;/li>
&lt;li>Security/incident response&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Privacy statement URL: The privacy policy is used to document the data
collected and processed by the service. You can use the
&lt;a href="https://docs.google.com/document/d/1ZU7VjH3g7qcfWcz0Z8TTv-vQiVoRA_wOsuMyJaz28Og/edit">Privacy Policy template&lt;/a>&lt;/li>
&lt;li>Logo URL (optional for showing in catalogues); if provided, logos SHOULD:
&lt;ul>
&lt;li>use a transparent background where appropriate to facilitate the usage of
logos within a user interface&lt;/li>
&lt;li>use PNG, or GIF (less preferred), images&lt;/li>
&lt;li>use HTTPS URLs in order to avoid mixed-content warnings within browsers&lt;/li>
&lt;li>have a size larger than 40000 and smaller than 50000 characters when
encoded in base64&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Country of the service&lt;/li>
&lt;li>Compliance with the &lt;a href="https://go.egi.eu/policies-and-procedures">EGI Policies&lt;/a>
and the
&lt;a href="https://wiki.refeds.org/display/CODE/Data+Protection+Code+of+Conduct+Home">REFEDS Data Protection Code of Conduct&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>The most important URLs for each environment are listed in the table below but
more information can be found in the protocol-specific sections that follow.&lt;/p>
&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-0-0-tab" data-toggle="tab" href="#tabs-0-0" role="tab"
aria-controls="tabs-0-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-0-1-tab" data-toggle="tab" href="#tabs-0-1" role="tab"
aria-controls="tabs-0-1" aria-selected="false">
Demo
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-0-2-tab" data-toggle="tab" href="#tabs-0-2" role="tab"
aria-controls="tabs-0-2" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-0-content">
&lt;div class="tab-pane show active"
id="tabs-0-0" role="tabpanel" aria-labelled-by="tabs-0-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-0-1" role="tabpanel" aria-labelled-by="tabs-0-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Demo environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai-demo.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-0-2" role="tabpanel" aria-labelled-by="tabs-0-2-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Protocol&lt;/th>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SAML&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai-dev.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenID Connect&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai-dev.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;h2 id="saml-service-provider">SAML Service Provider&lt;/h2>
&lt;p>To enable federated access to a web-based application, you can connect to the
EGI Check-in IdP as a SAML Service Provider (SP). Users of the application will
be redirected to Check-in in order to log in, and Check-in can authenticate them
using any of the supported backend authentication mechanisms, such as
institutional IdPs registered with eduGAIN or Social Providers. Once the user is
authenticated, EGI Check-in will return a SAML assertion to the application
containing information about the authenticated user.&lt;/p>
&lt;h3 id="metadata-registration">Metadata registration&lt;/h3>
&lt;p>SAML authentication relies on the use of metadata. Both parties (you as a SP and
the EGI Check-in IdP) need to exchange metadata in order to know and trust each
other. The metadata include information such as the location of the service
endpoints that need to be invoked, as well as the certificates that will be used
to sign SAML messages. The format of the exchanged metadata should be based on
the XML-based
&lt;a href="https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf">SAML 2.0 specification&lt;/a>.
Usually, you will not need to manually create such an XML document, as this is
automatically generated by all major SAML 2.0 SP software solutions (e.g.,
Keycloak, Shibboleth, SimpleSAMLphp, and &lt;code>mod_auth_mellon&lt;/code>). It is important
that you serve your metadata over HTTPS using a browser-friendly SSL
certificate, i.e. issued by a trusted certificate authority.&lt;/p>
&lt;p>You can get the metadata of the EGI Check-in IdP Proxy on a dedicated URL that
depends on the integration environment being used:&lt;/p>
&lt;!-- markdownlint-disable no-inline-html -->
&lt;ul class="nav nav-tabs" id="tabs-1" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-1-0-tab" data-toggle="tab" href="#tabs-1-0" role="tab"
aria-controls="tabs-1-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-1-1-tab" data-toggle="tab" href="#tabs-1-1" role="tab"
aria-controls="tabs-1-1" aria-selected="false">
Demo
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-1-2-tab" data-toggle="tab" href="#tabs-1-2" role="tab"
aria-controls="tabs-1-2" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-1-content">
&lt;div class="tab-pane show active"
id="tabs-1-0" role="tabpanel" aria-labelled-by="tabs-1-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Instance&lt;/th>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Keycloak-based EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai.egi.eu/auth/realms/egi&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legacy EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai.egi.eu/proxy/saml2/idp/metadata.php">https://aai.egi.eu/proxy/saml2/idp/metadata.php&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai.egi.eu/proxy/saml2/idp/metadata.php&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-1-1" role="tabpanel" aria-labelled-by="tabs-1-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Instance&lt;/th>
&lt;th>Demo environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Keycloak-based EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai-demo.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai-demo.egi.eu/auth/realms/egi&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legacy EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai-demo.egi.eu/proxy/saml2/idp/metadata.php">https://aai-demo.egi.eu/proxy/saml2/idp/metadata.php&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai-demo.egi.eu/proxy/saml2/idp/metadata.php&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-1-2" role="tabpanel" aria-labelled-by="tabs-1-2-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Instance&lt;/th>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Keycloak-based EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/saml/descriptor">https://aai-dev.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai-dev.egi.eu/auth/realms/egi&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legacy EGI Check-in IdP&lt;/td>
&lt;td>&lt;ul>&lt;li>SAML Metadata URL: &lt;a href="https://aai-dev.egi.eu/proxy/saml2/idp/metadata.php">https://aai-dev.egi.eu/proxy/saml2/idp/metadata.php&lt;/a>&lt;/li>&lt;li>SAML entity ID: &lt;code>https://aai-dev.egi.eu/proxy/saml2/idp/metadata.php&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- markdownlint-enable no-inline-html -->
&lt;p>To register your SAML SP, you must submit a service registration request
through the &lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a>. Your request
should include essential information about your service, as outlined in the
&lt;a href="#general-information">General Information&lt;/a> section, along with your SP&amp;rsquo;s
metadata URL and entity ID.&lt;/p>
&lt;h3 id="metadata">Metadata&lt;/h3>
&lt;p>Metadata provided by your SP should contain a descriptive name of the service
that your SP represents in at least English. It is recommended to also provide
the name in other languages which are commonly used in the geographic scope of
the deployment. The name should be placed in the &lt;code>&amp;lt;md:ServiceName&amp;gt;&lt;/code> in the
&lt;code>&amp;lt;md:AttributeConsumingService&amp;gt;&lt;/code> container.&lt;/p>
&lt;p>It is recommended that your SP metadata contains:&lt;/p>
&lt;ul>
&lt;li>an &lt;code>&amp;lt;md:SPSSODescriptor&amp;gt;&lt;/code> role element containing
&lt;ul>
&lt;li>an &lt;code>AuthnRequestsSigned&lt;/code> and an &lt;code>WantAssertionsSigned&lt;/code> attribute set to
&lt;code>true&lt;/code>&lt;/li>
&lt;li>at least one &lt;code>&amp;lt;md:AssertionConsumerService&amp;gt;&lt;/code> endpoint element&lt;/li>
&lt;li>at least one &lt;code>&amp;lt;md:KeyDescriptor&amp;gt;&lt;/code> element whose use attribute is omitted or
set to encryption&lt;/li>
&lt;li>an &lt;code>&amp;lt;md:Extensions&amp;gt;&lt;/code> element at the role level containing
&lt;ul>
&lt;li>an &lt;code>&amp;lt;mdui:UIInfo&amp;gt;&lt;/code> extension element containing the child elements
&lt;code>&amp;lt;mdui:DisplayName&amp;gt;&lt;/code>, &lt;code>&amp;lt;mdui:Logo&amp;gt;&lt;/code>, and &lt;code>&amp;lt;mdui:PrivacyStatementURL&amp;gt;&lt;/code>&lt;/li>
&lt;li>an &lt;code>&amp;lt;mdattr:EntityAttributes&amp;gt;&lt;/code> extension element for signaling Subject
Identifier requirements with previously prescribed content&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>an &lt;code>&amp;lt;md:ContactPerson&amp;gt;&lt;/code> element with a contactType of &lt;code>support&lt;/code> and/or a
&lt;code>&amp;lt;md:ContactPerson&amp;gt;&lt;/code> element with a contactType of &lt;code>technical&lt;/code>. The
&lt;code>&amp;lt;md:ContactPerson&amp;gt;&lt;/code> element(s) should contain at least one
&lt;code>&amp;lt;md:EmailAddress&amp;gt;&lt;/code>. The support address may be used for generic support
questions about the service, while the technical contact may be contacted
regarding technical interoperability problems. The technical contact must be
responsible for the technical operation of the service represented by your
SP.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>If the SP supports the Single Logout profile, then its metadata &lt;strong>MUST&lt;/strong> contain
(within its &lt;code>&amp;lt;md:SPSSODescriptor&amp;gt;&lt;/code> role element):&lt;/p>
&lt;ul>
&lt;li>at least one &lt;code>&amp;lt;md:KeyDescriptor&amp;gt;&lt;/code> element whose use attribute is omitted or
set to signing&lt;/li>
&lt;li>at least one &lt;code>&amp;lt;md:SingleLogoutService&amp;gt;&lt;/code> endpoint element (this MAY be omitted
if the SP solely issues &lt;code>&amp;lt;samlp:LogoutRequest&amp;gt;&lt;/code> messages containing the
&lt;code>&amp;lt;aslo:Asynchronous&amp;gt;&lt;/code> extension
&lt;a href="https://docs.oasis-open.org/security/saml/Post2.0/saml-async-slo/v1.0/cs01/saml-async-slo-v1.0-cs01.pdf">SAML2ASLO&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="attributes">Attributes&lt;/h3>
&lt;p>The EGI Check-in IdP is guaranteed to release a minimal subset of the
&lt;a href="https://refeds.org/category/research-and-scholarship">REFEDS R&amp;amp;S&lt;/a> attribute
bundle to connected Service Providers without administrative involvement,
subject to user consent. The following attributes constitute a minimal subset of
the R&amp;amp;S attribute bundle:&lt;/p>
&lt;ul>
&lt;li>Community User Identifier (CUID) which is a globally unique, opaque,
persistent and non-reassignable identifier identifying the user
(&lt;code>voPersonID&lt;/code>). For users whose community identity is managed by Check-in,
this identifier is of the form &lt;code>&amp;lt;uniqueID&amp;gt;@egi.eu&lt;/code>. The &lt;code>&amp;lt;uniqueID&amp;gt;&lt;/code> portion
is an opaque identifier issued by Check-in.&lt;/li>
&lt;li>Email address (&lt;code>mail&lt;/code>)&lt;/li>
&lt;li>Display name (&lt;code>displayName&lt;/code>) OR (&lt;code>givenName&lt;/code> AND &lt;code>sn&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>A more extensive list of all the attributes that may be made available to
Service Providers is included in the &lt;a href="#user-attributes">User Attribute&lt;/a> section.&lt;/p>
&lt;h3 id="attribute-based-authorisation">Attribute-based authorisation&lt;/h3>
&lt;blockquote>
&lt;p>As mentioned in &lt;a href="#general-information">the General Information&lt;/a>, omitting
authorisation checks may lead to abuse of the service.&lt;/p>
&lt;/blockquote>
&lt;p>EGI Check-in provides information about the authenticated user that may be used
by Service Providers in order to control user access to resources. This
information is provided by the EGI Check-in IdP in the
&lt;a href="#attributes">SAML attribute assertion&lt;/a>. The table below lists the SAML
attributes that are relevant for user authorisation:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Description&lt;/th>
&lt;th>SAML Attribute&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="#vogroup-membership-and-role-information">VO/group membership/roles of the authenticated user&lt;/a>&lt;/td>
&lt;td>&lt;code>eduPersonEntitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#capabilities">Capabilities&lt;/a>&lt;/td>
&lt;td>&lt;code>eduPersonEntitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#gocdb-roles">GOCDB roles&lt;/a>&lt;/td>
&lt;td>&lt;code>eduPersonEntitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#identity-assurance">Identity Assurance&lt;/a>&lt;/td>
&lt;td>&lt;code>eduPersonAssurance&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="service-provider-migration-to-keycloak">Service Provider Migration to Keycloak&lt;/h3>
&lt;p>The migration guide below applies to SAML Service Providers (SPs) registered in
the &lt;strong>Development&lt;/strong>, &lt;strong>Demo&lt;/strong> and &lt;strong>Production&lt;/strong> environments of Check-in.&lt;/p>
&lt;p>&lt;strong>Development and Demo&lt;/strong>: Beginning March 9, 2023, SAML SPs using the legacy
Check-in IdP metadata will no longer be supported.&lt;/p>
&lt;p>&lt;strong>Production&lt;/strong>: Beginning December 12, 2023, SAML SPs using the legacy
Check-in IdP metadata will no longer be supported.&lt;/p>
&lt;h4 id="how-to-migrate-your-service-to-keycloak">How to Migrate your Service to Keycloak&lt;/h4>
&lt;p>If your SAML SP is not yet registered in the
&lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a>, you will need to submit
a service registration request. This request should include essential
information about your service, as described in the
&lt;a href="#general-information">General Information&lt;/a> section, in addition to your SAML
SP&amp;rsquo;s metadata URL and entity ID.&lt;/p>
&lt;p>If your SAML SP is already registered, please ensure the accuracy of the
information under the &lt;strong>General&lt;/strong> tab, particularly the policy and contact
details, as well as the &lt;strong>Protocol Specific&lt;/strong> tab.
Pay special attention to the new &lt;strong>Requested Attributes&lt;/strong> section, which
allows you to manage the user attributes available through Check-in.&lt;/p>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important&lt;/h4>
If your SAML SP relies on
experimental features of Check-in which are only available in the
&lt;strong>Development&lt;/strong> environment, you will need to re-register your SP through the
&lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a> using the &amp;ldquo;Copy Service&amp;rdquo;
functionality.
&lt;/div>
&lt;h5 id="new-identity-provider-metadata">New Identity Provider Metadata&lt;/h5>
&lt;p>The first thing you need to do is to update the IdP metadata URL in the SP
configuration, according to the &lt;a href="#metadata-registration">Metadata registration&lt;/a>
section.&lt;/p>
&lt;h5 id="new-attributes">New Attributes&lt;/h5>
&lt;p>When migrating your SP to the Keycloak-based EGI Check-in IdP, please be aware
that some attributes will no longer be supported. These deprecated attributes
will be replaced by new ones, as detailed in the table below:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Deprecated Attributes&lt;/th>
&lt;th>New Attributes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>distinguishedName&lt;/code>&lt;/td>
&lt;td>&lt;code>voPersonCertificateDN&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>eduPersonScopedAffiliation&lt;/code>&lt;/td>
&lt;td>&lt;code>voPersonExternalAffiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>eduPersonUniqueId&lt;/code>&lt;/td>
&lt;td>&lt;code>voPersonID&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
The values of the deprecated attributes
will remain unchanged; only the attribute names will be different.
&lt;/div>
&lt;p>Ensure that you update the attribute mapping in your SP configuration to align
with the new attribute names.&lt;/p>
&lt;h5 id="nameid">NameID&lt;/h5>
&lt;p>Use of &lt;code>&amp;lt;saml:NameID&amp;gt;&lt;/code> elements is intended for the Single Logout profile and
is not suitable for long-term identification of users.
For user identification, you should use the &lt;code>voPersonID&lt;/code> SAML attribute, as
detailed in the &lt;a href="#user-attributes">User attributes&lt;/a> section.
Your SAML SP should explicitly specify in its metadata the NameID formats it
supports from the following options:&lt;/p>
&lt;ul>
&lt;li>Persistent (&lt;code>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent&lt;/code>)&lt;/li>
&lt;li>Transient (&lt;code>urn:oasis:names:tc:SAML:2.0:nameid-format:transient&lt;/code>)&lt;/li>
&lt;li>Email address (&lt;code>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress&lt;/code>)&lt;/li>
&lt;li>Unspecified (&lt;code>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>Otherwise, Keycloak will assign the unspecified
(&lt;code>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified&lt;/code>) NameID format to
your SP.&lt;/p>
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.keycloak.org/docs/latest/server_admin/#saml-v2-0-identity-providers">Keycloak Service Provider Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://shibboleth.atlassian.net/wiki/spaces/SP3/overview">Shibboleth Service Provider Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://simplesamlphp.org/docs/stable/simplesamlphp-sp.html">SimpleSAMLphp Service Provider QuickStart&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/latchset/mod_auth_mellon">Simple SAML 2.0 service provider with mod_auth_mellon Apache module&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="example-saml-service-provider-configurations">Example SAML Service Provider Configurations&lt;/h3>
&lt;h4 id="keycloak">Keycloak&lt;/h4>
&lt;p>If you are using Keycloak as an SAML Service Provider, then you need to follow
the steps below in order to register EGI Check-in as an Identity Provider:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Access the administrator console of your Keycloak instance and navigate to
&amp;ldquo;Identity Providers&amp;rdquo; and then select &amp;ldquo;SAML v2.0&amp;rdquo;&lt;/p>
&lt;p>&lt;img src="saml-examples-keycloak-idp.png" alt="Keycloak IdP Page">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>In the next page, complete the following fields:&lt;/p>
&lt;ul>
&lt;li>Alias: &lt;code>egi-check-in-saml&lt;/code>&lt;/li>
&lt;li>Display name: &lt;code>EGI Check-in&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="saml-examples-keycloak-add-saml-idp-1.png" alt="Add SAML IdP">&lt;/p>
&lt;p>Scroll down, and complete the rest options:&lt;/p>
&lt;ul>
&lt;li>SAML entity descriptor: &lt;code>https://aai.egi.eu/auth/realms/egi/protocol/saml/descriptor&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="saml-examples-keycloak-add-saml-idp-2.png" alt="Add SAML IdP">&lt;/p>
&lt;p>And then click on the &amp;ldquo;Add&amp;rdquo; button.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>After adding EGI Check-in IdP, scroll down to the &amp;ldquo;SAML settings&amp;rdquo; section and
edit the following options:&lt;/p>
&lt;ul>
&lt;li>Principal type: &lt;code>Attribute [Name]&lt;/code>&lt;/li>
&lt;li>Principal attribute: &lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.6&lt;/code>&lt;/li>
&lt;li>HTTP-POST binding response: &lt;code>On&lt;/code>&lt;/li>
&lt;li>HTTP-POST binding for AuthnRequest: &lt;code>Off&lt;/code>&lt;/li>
&lt;li>HTTP-POST binding logout: &lt;code>Off&lt;/code>&lt;/li>
&lt;li>Want AuthnRequests signed: &lt;code>Off&lt;/code>&lt;/li>
&lt;li>Want Assertions signed: &lt;code>Off&lt;/code>&lt;/li>
&lt;li>Want Assertions encrypted: &lt;code>On&lt;/code>&lt;/li>
&lt;li>Validate Signatures: &lt;code>On&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.6&lt;/code> is
the OID presentation of the &lt;code>voPersonID&lt;/code> attribute.
&lt;/div>
&lt;p>&lt;img src="saml-examples-keycloak-saml-idp-saml-setting.png" alt="SAML Settings">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Then, scroll down to the &amp;ldquo;Advanced settings&amp;rdquo; section and enable the &amp;ldquo;Trust
Email&amp;rdquo; option and click on &amp;ldquo;Save&amp;rdquo;.&lt;/p>
&lt;p>&lt;img src="saml-examples-keycloak-saml-idp-advanced.png" alt="Advanced Settings">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Next, you will need to create a mapper for each attribute that your Service
Provider will request from EGI Check-in Proxy. Go to the &amp;ldquo;Mappers&amp;rdquo; tab and
then click on &amp;ldquo;Add Mapper&amp;rdquo;.&lt;/p>
&lt;p>For the &lt;code>voPersonID&lt;/code> attribute you will need to add the following options:&lt;/p>
&lt;ul>
&lt;li>Name: &lt;code>voPersonID&lt;/code>&lt;/li>
&lt;li>Sync Mode Override: &lt;code>import&lt;/code>&lt;/li>
&lt;li>Mapper Type: &lt;code>Attribute Importer&lt;/code>&lt;/li>
&lt;li>Attribute Name: &lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.6&lt;/code>&lt;/li>
&lt;li>Friendly Name: &lt;code>voPersonID&lt;/code>&lt;/li>
&lt;li>Name Format: &lt;code>ATTRIBUTE_FORMAT_URI&lt;/code>&lt;/li>
&lt;li>User Attribute Name: &lt;code>voPersonID&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="saml-examples-keycloak-saml-vopersonid-mapper.png" alt="voPersonID mapper">&lt;/p>
&lt;p>And for the &lt;code>eduperson_entitlement&lt;/code> claim:&lt;/p>
&lt;ul>
&lt;li>Name: &lt;code>eduPersonEntitlement&lt;/code>&lt;/li>
&lt;li>Sync Mode Override: &lt;code>Inherit&lt;/code>&lt;/li>
&lt;li>Mapper Type: &lt;code>Attribute Importer&lt;/code>&lt;/li>
&lt;li>Attribute Name: &lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.7&lt;/code>&lt;/li>
&lt;li>Friendly Name: &lt;code>eduPersonEntitlement&lt;/code>&lt;/li>
&lt;li>Name Format: &lt;code>ATTRIBUTE_FORMAT_URI&lt;/code>&lt;/li>
&lt;li>User Attribute Name: &lt;code>eduPersonEntitlement&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="saml-examples-keycloak-saml-edupersonentitlement-mapper.png" alt="eduPersonEntitlement mapper">&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
For other
&lt;a href="#user-attributes">attributes&lt;/a>, create a mapper similar to the
&lt;code>eduPersonEntitlement&lt;/code> mapper.
&lt;/div>
&lt;/li>
&lt;/ol>
&lt;h2 id="openid-connect-service-provider">OpenID Connect Service Provider&lt;/h2>
&lt;p>Service Providers can be integrated with EGI Check-in using OpenID Connect
(OIDC) as an alternative to the SAML2 protocol. To allow this, the EGI Check-in
IdP provides an OpenID Connect (OAuth2) API based on
&lt;a href="https://www.keycloak.org">Keycloak&lt;/a>, which has been
&lt;a href="https://openid.net/certification/">certified by the OpenID Foundation&lt;/a>.
Interconnection with the EGI Check-in OpenID Provider allows users to sign in
using any of the supported backend authentication mechanisms, such as
institutional IdPs registered with eduGAIN or Social Providers. Once the user
has signed in, EGI Check-in can return OIDC Claims containing information about
the authenticated user.&lt;/p>
&lt;h3 id="client-registration">Client registration&lt;/h3>
&lt;p>Before your service can use the EGI Check-in OpenID Provider for user login, you
must submit a service registration request using
&lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a> in order to obtain OAuth
2.0 credentials. The client configuration should include the general information
about your service, as described in &lt;a href="#general-information">General Information&lt;/a>
section.&lt;/p>
&lt;h4 id="obtaining-oauth-20-credentials">Obtaining OAuth 2.0 credentials&lt;/h4>
&lt;p>You need OAuth 2.0 credentials, which typically include a client ID and client
secret, to authenticate users through the EGI Check-in OpenID Provider.&lt;/p>
&lt;p>You can specify the client ID and secret when creating/editing your client or
let them being automatically generated during registration (&lt;em>recommended&lt;/em>).&lt;/p>
&lt;p>To find the ID and secret of your client, do the following:&lt;/p>
&lt;ol>
&lt;li>Select your client from the
&lt;a href="https://aai.egi.eu/federation">Manage Services Page&lt;/a>.&lt;/li>
&lt;li>Look for the &lt;strong>Client ID&lt;/strong> in the &lt;strong>Protocol&lt;/strong> tab.&lt;/li>
&lt;li>Select the &lt;strong>Display/edit client secret:&lt;/strong> option from the &lt;strong>Protocol&lt;/strong> tab.&lt;/li>
&lt;/ol>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can copy these values using the
green copy button next to the desired field.
&lt;/div>
&lt;h3 id="redirection-uris">Redirection URIs&lt;/h3>
&lt;p>OpenID Connect Services &lt;strong>MUST&lt;/strong> pre-register one or more Redirection URI(s) to
which authentication responses from EGI Check-in will be sent. EGI Check-in
utilises exact matching of the redirect URI specified in an authentication
request against the pre-registered URIs
&lt;a href="https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics#section-4.1">OAuth2-BCP&lt;/a>,
with the matching performed as described in
&lt;a href="https://www.rfc-editor.org/rfc/rfc3986#section-6.2.1">RFC3986&lt;/a> (Simple String
Comparison). Redirection URIs &lt;strong>MUST&lt;/strong> use the schemata defined in Section
3.1.2.1 of the
&lt;a href="https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest">OIDC-Core&lt;/a>
specification. Note that the Redirection URI &lt;strong>MUST&lt;/strong> use the &lt;code>https&lt;/code> scheme;
the use of &lt;code>http&lt;/code> Redirection URIs is only allowed in the development
environment.&lt;/p>
&lt;h3 id="claims">Claims&lt;/h3>
&lt;p>The EGI Check-in UserInfo Endpoint is an OAuth 2.0 Protected Resource that
returns specific information about the authenticated end user as Claim Values.
To obtain the requested Claims about the end user, the Client makes a request to
the UserInfo Endpoint using an Access Token obtained through OpenID Connect
Authentication. The scopes associated with the Access Token used to access the
EGI Check-in UserInfo Endpoint will determine what Claims will be released.
These Claims are represented by a JSON object that contains a collection of name
and value pairs for the Claims.&lt;/p>
&lt;p>The following scope values can be used to request Claims from the EGI Check-in
UserInfo Endpoint:&lt;/p>
&lt;!-- markdownlint-disable no-inline-html -->
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scope&lt;/th>
&lt;th>Claims&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>openid&lt;/code>&lt;/td>
&lt;td>&lt;code>sub&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>voperson_id&lt;/code>&lt;/td>
&lt;td>&lt;code>voperson_id&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>profile&lt;/code>&lt;/td>
&lt;td>&lt;ul>&lt;li>&lt;code>name&lt;/code>&lt;/li>&lt;li>&lt;code>given_name&lt;/code>&lt;/li>&lt;li>&lt;code>family_name&lt;/code>&lt;/li>&lt;li>&lt;code>preferred_username&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>email&lt;/code>&lt;/td>
&lt;td>&lt;ul>&lt;li>&lt;code>email&lt;/code>&lt;/li>&lt;li>&lt;code>email_verified&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_verified_email&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>aarc&lt;/code>&lt;/td>
&lt;td>&lt;ul>&lt;li>&lt;code>name&lt;/code>&lt;/li>&lt;li>&lt;code>given_name&lt;/code>&lt;/li>&lt;li>&lt;code>family_name&lt;/code>&lt;/li>&lt;li>&lt;code>preferred_username&lt;/code>&lt;/li>&lt;li>&lt;code>email&lt;/code>&lt;/li>&lt;li>&lt;code>email_verified&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_verified_email&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_certificate_dn&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_certificate_issuer_dn&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_external_affiliation&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_id&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;td>&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>voperson_certificate&lt;/code>&lt;/td>
&lt;td>&lt;ul>&lt;li>&lt;code>voperson_certificate_dn&lt;/code>&lt;/li>&lt;li>&lt;code>voperson_certificate_issuer_dn&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>voperson_external_affiliation&lt;/code>&lt;/td>
&lt;td>&lt;code>voperson_external_affiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- markdownlint-enable no-inline-html -->
&lt;p>A more extensive list of all the attributes that may be made available to
Service Providers is included in the &lt;a href="#user-attributes">User Attribute&lt;/a> section.&lt;/p>
&lt;h3 id="grant-types">Grant Types&lt;/h3>
&lt;p>Check-in supports the following OpenID Connect/OAuth2 grant types:&lt;/p>
&lt;ul>
&lt;li>Authorization Code: used by Web Apps executing on a server.&lt;/li>
&lt;li>Token Exchange: used by clients to request and obtain security tokens in
support of delegated access to resources.&lt;/li>
&lt;li>Device Code: used by devices that lack a browser to perform a user-agent based
OAuth flow.&lt;/li>
&lt;li>Client credentials: used by clients to obtain an access token outside of the
context of a user. Such an access token is typically used by clients to access
resources about themselves rather than to access a user&amp;rsquo;s resources.&lt;/li>
&lt;/ul>
&lt;h4 id="authorization-code">Authorization Code&lt;/h4>
&lt;p>The Authorization Code Flow returns an Authorization Code to the Client, which
can then exchange it for an ID Token and an Access Token directly. This provides
the benefit of not exposing any tokens to the User Agent and possibly other
malicious applications with access to the User Agent. The Authorization Server
can also authenticate the Client before exchanging the Authorization Code for an
Access Token. The Authorization Code flow is suitable for Clients that can
securely maintain a Client Secret between themselves and the Authorization
Server.&lt;/p>
&lt;h5 id="authorization-code-flow-steps">Authorization Code Flow Steps&lt;/h5>
&lt;p>The Authorization Code Flow goes through the following steps.&lt;/p>
&lt;ol>
&lt;li>Client prepares an Authentication Request containing the desired request
parameters.&lt;/li>
&lt;li>Client sends the request to the Authorization Server.&lt;/li>
&lt;li>Authorization Server Authenticates the end user.&lt;/li>
&lt;li>Authorization Server obtains end user Consent/Authorization.&lt;/li>
&lt;li>Authorization Server sends the end user back to the Client with an
Authorization Code.&lt;/li>
&lt;li>Client requests a response using the Authorization Code at the Token
Endpoint.&lt;/li>
&lt;li>Client receives a response that contains an ID Token and Access Token in the
response body.&lt;/li>
&lt;li>Client validates the ID token and retrieves the end user&amp;rsquo;s Subject
Identifier.&lt;/li>
&lt;/ol>
&lt;h5 id="authentication-request">Authentication Request&lt;/h5>
&lt;p>The request parameters of the Authorization Endpoint are:&lt;/p>
&lt;ul>
&lt;li>&lt;code>client_id&lt;/code>: ID of the client that ask for authentication to the Authorization
Server.&lt;/li>
&lt;li>&lt;code>redirect_uri&lt;/code>: URI to which the response will be sent.&lt;/li>
&lt;li>&lt;code>scope&lt;/code>: A list of attributes that the application requires.&lt;/li>
&lt;li>&lt;code>state&lt;/code>: Opaque value used to maintain state between the request and the
callback.&lt;/li>
&lt;li>&lt;code>response_type&lt;/code>: value that determines the authorization processing flow to be
used. For &lt;strong>Authorization Code&lt;/strong> grant set &lt;code>response_type=code&lt;/code>. This way the
response will include an Authorization Code.&lt;/li>
&lt;/ul>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: ${AUTHORIZATION_ENDPOINT}?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">response_type=code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;scope=openid%20profile%20email&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;client_id=s6BhdRkqt3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;state=af0ifabcd&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the
&lt;code>AUTHORIZATION_ENDPOINT&lt;/code> in the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: https://client.example.org/cb?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">code=SplxlOBeZQQYbYS6WxSbIA&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;state=af0ifabcd&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="token-request">Token Request&lt;/h5>
&lt;p>A Client makes a Token Request by presenting its Authorization Grant (in the
form of an Authorization Code) to the Token Endpoint using the &lt;code>grant_type&lt;/code>
value &lt;code>authorization_code&lt;/code>, as described in Section 4.1.3 of OAuth 2.0
&lt;a href="https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3">RFC6749&lt;/a>. If the Client
is a Confidential Client, then it &lt;strong>MUST&lt;/strong> authenticate to the Token Endpoint
using the authentication method registered for its &lt;code>client_id&lt;/code>. The Client sends
the parameters to the Token Endpoint using the HTTP &lt;code>POST&lt;/code> method and the Form
Serialization.&lt;/p>
&lt;p>The parameters that are present in the token request are described in the table
below:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>grant_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>authorization_code&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>code&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The value of the code in the response from Authorization Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>redirect_uri&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>URI to which the response will be sent (must be the same as the request to Authorization Endpoint)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#39;Content-Type: application/x-www-form-urlencoded&amp;#39;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -u &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>:&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=authorization_code&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code=SplxlOBeZQQYbYS6WxSbIA&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;SlAV32hkKG...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3600&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyabcdGciOiJSUzI1N...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="proof-key-for-code-exchange-pkce">Proof Key for Code Exchange (PKCE)&lt;/h4>
&lt;p>The Proof Key for Code Exchange (PKCE, pronounced pixie) extension
(&lt;a href="https://tools.ietf.org/html/rfc7636">RFC 7636&lt;/a>) describes a technique for
public clients (clients without &lt;code>client_secret&lt;/code>) to mitigate the threat of
having the Authorization Code intercepted. The technique involves the client
first creating a secret, and then using that secret again when exchanging the
Authorization Code for an access token. This way if the code is intercepted, it
will not be useful since the token request relies on the initial secret.&lt;/p>
&lt;h5 id="client-configuration">Client configuration&lt;/h5>
&lt;p>To enable PKCE you need to go to the
&lt;a href="https://aai.egi.eu/federation">Manage Services Page&lt;/a> and create/edit a client.
In &amp;ldquo;Protocol&amp;rdquo; tab under &amp;ldquo;Token Endpoint Authentication Method&amp;rdquo; select &amp;ldquo;No
authentication&amp;rdquo; and in &amp;ldquo;Crypto&amp;rdquo; tab under &amp;ldquo;Proof Key for Code Exchange (PKCE)
Code Challenge Method&amp;rdquo; select &amp;ldquo;SHA-256 hash algorithm&amp;rdquo;.&lt;/p>
&lt;h5 id="protocol-flow">Protocol Flow&lt;/h5>
&lt;p>Because the PKCE-enhanced Authorization Code Flow builds upon the standard
Authorization Code Flow, the steps are very similar.&lt;/p>
&lt;p>First, the client creates and records a secret named the &lt;code>code_verifier&lt;/code>. The
&lt;code>code_verifier&lt;/code> is a high-entropy cryptographic random STRING using the
unreserved characters [A-Z] / [a-z] / [0-9] / &amp;ldquo;-&amp;rdquo; / &amp;ldquo;.&amp;rdquo; / &amp;ldquo;_&amp;rdquo; / &amp;ldquo;~&amp;rdquo;, with a
minimum length of 43 characters and a maximum length of 128 characters. Then the
client creates a &lt;code>code_challenge&lt;/code> derived from the &lt;code>code_verifier&lt;/code> by using one
of the following transformations on the code verifier:&lt;/p>
&lt;ul>
&lt;li>&lt;code>plain&lt;/code> code_challenge = code_verifier&lt;/li>
&lt;li>&lt;code>S256&lt;/code> code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))&lt;/li>
&lt;/ul>
&lt;p>If the client is capable of using &lt;code>S256&lt;/code>, it MUST use &lt;code>S256&lt;/code>. Clients are
permitted to use &lt;code>plain&lt;/code> only if they cannot support &lt;code>S256&lt;/code> for some technical
reason.&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
There are various tools that generate
these values such as &lt;a href="https://tonyxu-io.github.io/pkce-generator/">https://tonyxu-io.github.io/pkce-generator/&lt;/a>
&lt;/div>
&lt;p>Then the &lt;code>code_challenge&lt;/code> is sent in the Authorization Request along with the
transformation method (&lt;code>code_challenge_method&lt;/code>).&lt;/p>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: ${AUTHORIZATION_ENDPOINT}?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">client_id=${CLIENT_ID}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;scope=openid%20profile%20email&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;redirect_uri=${REDIRECT_URI}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;response_type=code&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;code_challenge=${CODE_CHALLENGE}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;code_challenge_method=S256&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the
&lt;code>AUTHORIZATION_ENDPOINT&lt;/code> in the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>The Authorization Endpoint responds as usual but records &lt;code>code_challenge&lt;/code> and
the &lt;code>code_challenge_method&lt;/code>.&lt;/p>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: ${REDIRECT_URI}?code=fgtLHT&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The client then sends the Authorization Code in the Access Token Request as
usual but includes the &lt;code>code_verifier&lt;/code> secret generated in the first request.&lt;/p>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=authorization_code&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CODE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;redirect_uri=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REDIRECT_URI&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code_verifier=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CODE_VERIFIER&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>The Authorization Server transforms &lt;code>code_verifier&lt;/code> and compares it to
&lt;code>code_challenge&lt;/code> from the first request. Access is denied if they are not equal.&lt;/p>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUlMyNTYifQ...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3599&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUlMyNTYifQ...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid email profile&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="refresh-flow">Refresh flow&lt;/h4>
&lt;p>The following request allows obtaining an access token from a refresh token
using the &lt;code>grant_type&lt;/code> value &lt;code>refresh_token&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>client_id&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The identifier of the client.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>client_secret&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The secret value of the client.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>grant_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>refresh_token&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>refresh_token&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>The value of the refresh token&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>scope&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>This parameter should contain openid at least&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -u &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>:&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=refresh_token&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;refresh_token=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REFRESH_TOKEN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20email%20profile&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWx...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3599&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYW...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;refresh_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyabcdGciOiJub25...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid profile email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="refresh-request-when-using-pkce">Refresh Request when using PKCE&lt;/h5>
&lt;p>To combine the refresh token grant type with PKCE you need to make the following
request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=refresh_token&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;refresh_token=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">REFRESH_TOKEN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20email%20profile&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;h4 id="token-exchange">Token Exchange&lt;/h4>
&lt;p>To get a token from client B using a token issued for client A, the parameters
of the request are:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>grant_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>urn:ietf:params:oauth:grant-type:token-exchange&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>audience&lt;/code>&lt;/td>
&lt;td>Optional&lt;/td>
&lt;td>Define the logical name of the service that the token will be used for&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>subject_token&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The value of the access token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>subject_token_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>urn:ietf:params:oauth:token-type:access_token&lt;/code> (because this feature accepts access tokens only)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>scope&lt;/code>&lt;/td>
&lt;td>Optional&lt;/td>
&lt;td>Define one or more scopes that are contained in the original token; otherwise all scopes will be selected&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -u &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_B_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>:&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_B_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=urn:ietf:params:oauth:grant-type:token-exchange&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;subject_token=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ACCESS_TOKEN_A&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;subject_token_type=urn:ietf:params:oauth:token-type:access_token&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20profile%20offline_access&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUl...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3599&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUl...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;refresh_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyabcdGciOiJub25lIn0.eyJleHAiO...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid profile offline_access&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="device-code">Device Code&lt;/h4>
&lt;p>The device code flow enables OAuth clients on (input-constrained) devices to
obtain user authorisation for accessing protected resources without using an
on-device user-agent, provided that they have an internet connection.&lt;/p>
&lt;h5 id="1-device-authorization-request">1. Device Authorization Request&lt;/h5>
&lt;p>The client initiates the authorisation flow by requesting a set of verification
codes from the Authorization Server by making an HTTP &amp;ldquo;POST&amp;rdquo; request to the
device Authorization Endpoint. The client constructs the request with the
following parameters:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>client_id&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The identifier of the client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>scope&lt;/code>&lt;/td>
&lt;td>Optional&lt;/td>
&lt;td>Define one or more scopes that are contained in the original token; otherwise all scopes will be selected&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">DEVICE_AUTHORIZATION_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_secret=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20email%20profile&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the
&lt;code>DEVICE_AUTHORIZATION_ENDPOINT&lt;/code> in the &lt;a href="#endpoints">Endpoints&lt;/a>
table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;device_code&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;HvtHOpSah_Anupq-0dtzvN7cb-wcnwxytiMzpBZBN6E&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">600&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;interval&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">5&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;user_code&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;NMEM-SDPK&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;verification_uri&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi/device&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;verification_uri_complete&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi/device?user_code=NMEM-SDPK&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="2-user-interaction">2. User Interaction&lt;/h5>
&lt;p>After receiving a successful Authorization Response, the client displays or
otherwise communicates the &lt;code>user_code&lt;/code> and the &lt;code>verification_uri&lt;/code> to the end
user and instructs them to visit the URI in a user agent on a secondary device
(for example, in a browser on their mobile phone), and enter the user code.&lt;/p>
&lt;h5 id="3-device-access-token-request">3. Device Access Token Request&lt;/h5>
&lt;p>After displaying instructions to the user, the client makes an Access Token
Request to the token endpoint. The request contains the following parameters:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>grant_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>urn:ietf:params:oauth:grant-type:device_code&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>device_code&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The device verification code, &lt;code>device_code&lt;/code> from the Device Authorization Response&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>client_id&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The identifier of the client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>client_secret&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>The secret value of the client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>scope&lt;/code>&lt;/td>
&lt;td>Optional&lt;/td>
&lt;td>Define one or more scopes that are contained in the original token; otherwise all scopes will be selected&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;device_code=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">DEVICE_CODE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_secret=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20profile&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJyc2ExIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJhZG1pbiIs...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3599&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJyc2ExIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiI5MDM0Mi...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid profile&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="device-code-with-pkce">Device Code with PKCE&lt;/h5>
&lt;p>To combine Device Code flow with PKCE you need to make the following requests:&lt;/p>
&lt;p>1 - Device Authorization Request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">DEVICE_AUTHORIZATION_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_secret=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20email%20profile&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code_challenge=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CODE_CHALLENGE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code_challenge_method=S256&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the
&lt;code>DEVICE_AUTHORIZATION_ENDPOINT&lt;/code> in the &lt;a href="#endpoints">Endpoints&lt;/a>
table.
&lt;/div>
&lt;p>2 - Device Access Token Request&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;device_code=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">DEVICE_CODE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_id=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;client_secret=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;code_verifier=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CODE_VERIFIER&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;h4 id="client-credentials">Client credentials&lt;/h4>
&lt;p>The parameters that are used in the Client Credentials flow are:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Presence&lt;/th>
&lt;th>Values&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>grant_type&lt;/code>&lt;/td>
&lt;td>Required&lt;/td>
&lt;td>&lt;code>client_credentials&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>scope&lt;/code>&lt;/td>
&lt;td>Optional&lt;/td>
&lt;td>Define scope(s) to request&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TOKEN_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -u &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>:&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;grant_type=client_credentials&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;scope=openid%20email%20profile%20eduperson_entitlement%20voperson_id&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>TOKEN_ENDPOINT&lt;/code> in the
&lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUl...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3599&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id_token&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;eyJraWQiOiJvaWRjIiwiYWxnIjoiUl...&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;not-before-policy&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">0&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;refresh_expires_in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">0&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid eduperson_entitlement voperson_id profile email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Example Access Token (decoded payload):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;azp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1deb9fbd-44a3-4dff-ab4a-49e092e7f566&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;clientAddress&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;xxx.xxx.xxx.xxx&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;clientHost&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;xxx.xxx.xxx.xxx&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;client_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1deb9fbd-44a3-4dff-ab4a-49e092e7f566&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;exp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1674473629&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;iat&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1674470029&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;iss&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;jti&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;bdf15737-01ba-4e61-b5bc-3304d637e2b6&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid eduperson_entitlement voperson_id profile email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sub&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;253b69f3-2325-4fd5-a26d-95e26b42bbaf@egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;typ&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;voperson_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;253b69f3-2325-4fd5-a26d-95e26b42bbaf@egi.eu&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="endpoints">Endpoints&lt;/h3>
&lt;p>The most important OIDC/OAuth2 endpoints are listed below:&lt;/p>
&lt;!-- markdownlint-disable no-inline-html -->
&lt;ul class="nav nav-tabs" id="tabs-20" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-20-0-tab" data-toggle="tab" href="#tabs-20-0" role="tab"
aria-controls="tabs-20-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-20-1-tab" data-toggle="tab" href="#tabs-20-1" role="tab"
aria-controls="tabs-20-1" aria-selected="false">
Demo
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-20-2-tab" data-toggle="tab" href="#tabs-20-2" role="tab"
aria-controls="tabs-20-2" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-20-content">
&lt;div class="tab-pane show active"
id="tabs-20-0" role="tabpanel" aria-labelled-by="tabs-20-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoints&lt;/th>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Provider configuration&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Issuer&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi">https://aai.egi.eu/auth/realms/egi&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Authorization&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Device Authorization&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JSON Web Key Sets(JWKS)&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/certs">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/certs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UserInfo&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Introspection&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logout&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/logout">https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/logout&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-20-1" role="tabpanel" aria-labelled-by="tabs-20-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoints&lt;/th>
&lt;th>Demo environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Provider configuration&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Issuer&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi">https://aai-demo.egi.eu/auth/realms/egi&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Authorization&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/auth">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/auth&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/token">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/token&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Device Authorization&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JSON Web Key Sets(JWKS)&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/certs">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/certs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UserInfo&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Introspection&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logout&lt;/td>
&lt;td>&lt;a href="https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/logout">https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/logout&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-20-2" role="tabpanel" aria-labelled-by="tabs-20-2-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoints&lt;/th>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Provider configuration&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/.well-known/openid-configuration">https://aai-dev.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Issuer&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi">https://aai-dev.egi.eu/auth/realms/egi&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Authorization&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/auth">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/auth&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/token">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/token&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Device Authorization&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JSON Web Key Sets(JWKS)&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/certs">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/certs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UserInfo&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/userinfo&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Introspection&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logout&lt;/td>
&lt;td>&lt;a href="https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/logout">https://aai-dev.egi.eu/auth/realms/egi/protocol/openid-connect/logout&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- markdownlint-enable no-inline-html -->
&lt;h4 id="authorization-endpoint">Authorization Endpoint&lt;/h4>
&lt;p>The Authorization Endpoint performs Authentication of the end user. This is done
by sending the User Agent to the Authorization Server's Authorization Endpoint
for Authentication and Authorisation, using request parameters defined by OAuth
2.0 and additional parameters and parameter values defined by OpenID Connect.&lt;/p>
&lt;p>For more information please check the
&lt;a href="#authorization-code">Authorization Code Flow&lt;/a>.&lt;/p>
&lt;h4 id="token-endpoint">Token Endpoint&lt;/h4>
&lt;p>To obtain an Access Token, an ID Token, and optionally a Refresh Token, the
Client sends a Token Request to the Token Endpoint.&lt;/p>
&lt;p>This endpoint is used in the following flows:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#authorization-code">Authorization Code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#refresh-flow">Refresh Token&lt;/a>&lt;/li>
&lt;li>&lt;a href="#token-exchange">Token Exchange&lt;/a>&lt;/li>
&lt;li>&lt;a href="#device-code">Device Code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#client-credentials">Client Credentials&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="device-authorization-endpoint">Device Authorization Endpoint&lt;/h4>
&lt;p>This endpoint has been introduced in the OAuth 2.0 Device Authorization Grant
specification &lt;a href="https://www.rfc-editor.org/rfc/rfc8628#section-3.1">RFC8628&lt;/a> and
it is used in Device Code Flow.&lt;/p>
&lt;p>The OAuth client on the device interacts with the authorization server directly
without presenting the request in a user agent, and the end user authorizes the
request on a separate device. This interaction is defined as follows.&lt;/p>
&lt;p>For more information please check the &lt;a href="#device-code">Device Code Flow&lt;/a>.&lt;/p>
&lt;h4 id="json-web-key-sets-endpoint">JSON Web Key Sets Endpoint&lt;/h4>
&lt;p>This URL points to the Authorization Server&amp;rsquo;s JWK Set
&lt;a href="https://www.rfc-editor.org/info/rfc7517">JWK&lt;/a> document. The referenced document
contains the signing key(s) the client uses to validate signatures from the
authorization server.&lt;/p>
&lt;h4 id="userinfo-endpoint">UserInfo Endpoint&lt;/h4>
&lt;p>The UserInfo Endpoint is an OAuth 2.0 Protected Resource that returns Claims
about the authenticated end user. To obtain the requested Claims about the end
user, the Client makes a request to the UserInfo Endpoint using an Access Token
obtained through OpenID Connect Authentication. These Claims are normally
represented by a JSON object that contains a collection of name and value pairs
for the Claims.&lt;/p>
&lt;h5 id="userinfo-request">UserInfo Request&lt;/h5>
&lt;p>The Client sends the UserInfo Request using either HTTP &lt;code>GET&lt;/code> or HTTP &lt;code>POST&lt;/code>.
The Access Token obtained from an OpenID Connect Authentication Request must be
sent as a Bearer Token, per Section 2 of
&lt;a href="https://www.rfc-editor.org/rfc/rfc6750#section-2">OAuth 2.0 Bearer Token Usage (RFC6750)&lt;/a>.&lt;/p>
&lt;p>It is recommended that the request use the HTTP &lt;code>GET&lt;/code> method and the Access
Token be sent using the Authorization header field.&lt;/p>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X GET &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">USERINFO_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-type: application/json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -H &lt;span style="color:#4e9a06">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ACCESS_TOKEN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>USERINFO_ENDPOINT&lt;/code> in
the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;eduperson_assurance&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://refeds.org/assurance/IAP/low&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/LoA#Substantial&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;eduperson_entitlement&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:members:role=member#aai.egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:role=member#aai.egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:vm_operator:role=member#aai.egi.eu&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;jdoe@example.org&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;email_verified&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;family_name&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;John&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;given_name&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Doe&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;John Doe&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;preferred_username&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;jdoe&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sub&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1234567890123456789012345678901234567890123456789012345678901234@egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;voperson_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1234567890123456789012345678901234567890123456789012345678901234@egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;voperson_verified_email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;jdoe@example.org&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="introspection-endpoint">Introspection Endpoint&lt;/h4>
&lt;p>The introspection endpoint is an OAuth 2.0 endpoint that takes a parameter
representing an OAuth 2.0 token and returns a JSON document representing the
meta information surrounding the token, including whether this token is
currently active.&lt;/p>
&lt;h5 id="introspection-request">Introspection Request&lt;/h5>
&lt;p>The protected resource calls the introspection endpoint using an HTTP &lt;code>POST&lt;/code>
request with parameters sent as &lt;code>application/x-www-form-urlencoded&lt;/code>.&lt;/p>
&lt;p>Example request:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ curl -X POST &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">INTROSPECTION_ENDPOINT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -u &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>:&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLIENT_SECRET&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -H &lt;span style="color:#4e9a06">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -d &lt;span style="color:#4e9a06">&amp;#34;token=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ACCESS_TOKEN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> python -m json.tool&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the
&lt;code>INTROSPECTION_ENDPOINT&lt;/code> in the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;p>Example response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;active&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;auth_time&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1668613335&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;authenticating_authority&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://idp.admin.grnet.gr/idp/shibboleth&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;azp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;token-portal&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;client_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;token-portal&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;eduperson_assurance&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://refeds.org/assurance/IAP/low&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/LoA#Substantial&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;eduperson_entitlement&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:members:role=member#aai.egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:role=member#aai.egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;urn:mace:egi.eu:group:demo.fedcloud.egi.eu:vm_operator:role=member#aai.egi.eu&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;jdoe@example.org&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;email_verified&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;exp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1668616935&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;iat&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">1668613335&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;iss&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;jti&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;fecaf906-8578-4155-9783-f2083900b93c&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;nonce&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;30ccf6777eb726aae4f71fc72684c07c&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid eduperson_entitlement voperson_id profile email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;session_state&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;dc0feb13-8a3d-4b91-86c6-039ee27503df&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sid&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;dc0feb13-8a3d-4b91-86c6-039ee27503df&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;sub&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1234567890123456789012345678901234567890123456789012345678901234@egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;typ&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Bearer&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;voperson_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;1234567890123456789012345678901234567890123456789012345678901234@egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;voperson_verified_email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;jdoe@example.org&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="logout-endpoint">Logout Endpoint&lt;/h4>
&lt;p>The EGI Check-in OpenID Provider supports user logout based on the
&lt;a href="https://openid.net/specs/openid-connect-rpinitiated-1_0.html">OpenID Connect RP-Initiated Logout&lt;/a>.&lt;/p>
&lt;p>The Logout Endpoint is normally obtained via the &lt;code>end_session_endpoint&lt;/code> element
of Check-in&amp;rsquo;s Provider Configuration (see &lt;a href="#endpoints">Endpoints&lt;/a> table).
Parameters used in the logout request are detailed below:&lt;/p>
&lt;ul>
&lt;li>&lt;code>id_token_hint&lt;/code>: The ID Token previously issued by Check-in to your Relying
Party (RP) and provided to the Logout Endpoint as a hint regarding the end
user&amp;rsquo;s current authenticated session with the client. It indicates the
identity of the end user that the RP is requesting Check-in to log out.
If the &lt;code>id_token_hint&lt;/code> parameter is omitted, the user may be prompted to
confirm the logout.&lt;/li>
&lt;li>&lt;code>client_id&lt;/code>: This parameter is used to specify the Client Identifier when
&lt;code>post_logout_redirect_uri&lt;/code> is specified but &lt;code>id_token_hint&lt;/code> is not.&lt;/li>
&lt;li>&lt;code>post_logout_redirect_uri&lt;/code>: URI to which the RP is requesting that the end
user&amp;rsquo;s browser be redirected after a logout has been performed. This URI
should use the HTTPS scheme and the value must have been previously registered
in the configuration of the Service in
&lt;a href="https://aai.egi.eu/federation">EGI Federation Registry&lt;/a>. Note that you need
to include either the &lt;code>client_id&lt;/code> or &lt;code>id_token_hint&lt;/code> parameter in case the
&lt;code>post_logout_redirect_uri&lt;/code> is included.&lt;/li>
&lt;/ul>
&lt;p>You can use either HTTP GET or HTTP POST to send the logout request to the Logout Endpoint.&lt;/p>
&lt;h5 id="example-request">Example Request&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: ${LOGOUT_ENDPOINT}?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">id_token_hint=${ID_TOKEN}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>LOGOUT_ENDPOINT&lt;/code> in
the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;h5 id="example-request-with-redirection">Example Request with redirection&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">HTTP&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">/&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.1&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">302&lt;/span> &lt;span style="color:#c00;font-weight:bold">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">Location: ${LOGOUT_ENDPOINT}?&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">post_logout_redirect_uri=${POST_LOGOUT_REDIRECT_URI}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">&amp;amp;client_id=${CLIENT_ID}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
You can find the &lt;code>LOGOUT_ENDPOINT&lt;/code> in
the &lt;a href="#endpoints">Endpoints&lt;/a> table.
&lt;/div>
&lt;h3 id="claims-based-authorisation">Claims-based authorisation&lt;/h3>
&lt;blockquote>
&lt;p>As mentioned in &lt;a href="#general-information">the General Information&lt;/a>, omitting
authorisation checks may lead to abuse of the service.&lt;/p>
&lt;/blockquote>
&lt;p>EGI Check-in provides information about the authenticated user that may be used
by Service Providers in order to control user access to resources. This
information is provided by the EGI Check-in OpenID Provider in the form of
&lt;a href="#claims">OIDC claims&lt;/a>. The table below lists the claims that are relevant for
user authorisation:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Description&lt;/th>
&lt;th>OIDC Claim&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="#vogroup-membership-and-role-information">VO/group membership/roles of the authenticated user&lt;/a>&lt;/td>
&lt;td>&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#capabilities">Capabilities&lt;/a>&lt;/td>
&lt;td>&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#gocdb-roles">GOCDB roles&lt;/a>&lt;/td>
&lt;td>&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="#identity-assurance">Identity Assurance&lt;/a>&lt;/td>
&lt;td>&lt;code>eduperson_assurance&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="example-oidc-client-configurations">Example OIDC Client Configurations&lt;/h3>
&lt;h4 id="keycloak-1">Keycloak&lt;/h4>
&lt;p>If you are using Keycloak as an OIDC Relying Party, then you need to follow the
steps below in order to register EGI Check-in as an Identity Provider:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Access the administrator console of your Keycloak instance and navigate to
&amp;ldquo;Identity Providers&amp;rdquo; and then select &amp;ldquo;OpenID Connect v1.0&amp;rdquo;&lt;/p>
&lt;p>&lt;img src="oidc-examples-keycloak-idp.png" alt="Keycloak IdP Page">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>In the next page, complete the following fields:&lt;/p>
&lt;ul>
&lt;li>Alias: &lt;code>egi-check-in-oidc&lt;/code>&lt;/li>
&lt;li>Display name: &lt;code>EGI Check-in&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="oidc-examples-keycloak-add-oidc-idp-1.png" alt="Add OIDC IdP">&lt;/p>
&lt;p>Scroll down, and complete the rest options:&lt;/p>
&lt;ul>
&lt;li>Discovery endpoint:
&lt;code>https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration&lt;/code>&lt;/li>
&lt;li>Client ID: &lt;code>&amp;lt;YOUR_CLIENT_ID&amp;gt;&lt;/code>&lt;/li>
&lt;li>Client Secret: &lt;code>&amp;lt;YOUR_CLIENT_SECRET&amp;gt;&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="oidc-examples-keycloak-add-oidc-idp-2.png" alt="Add OIDC IdP">&lt;/p>
&lt;p>And then click on the &amp;ldquo;Add&amp;rdquo; button.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>After adding EGI Check-in IdP, scroll down to the &amp;ldquo;OpenID Connect settings&amp;rdquo;
section and expand the &amp;ldquo;Advanced&amp;rdquo; option and then add the scopes that the
Service needs. For example:&lt;/p>
&lt;p>Scopes: &lt;code>openid voperson_id email profile eduperson_entitlement&lt;/code>&lt;/p>
&lt;p>&lt;img src="oidc-examples-keycloak-oidc-idp-oidc.png" alt="OpenID Connect Settings">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Then, scroll down to the &amp;ldquo;Advanced settings&amp;rdquo; section and enable the &amp;ldquo;Trust
Email&amp;rdquo; option and click on &amp;ldquo;Save&amp;rdquo; button.&lt;/p>
&lt;p>&lt;img src="oidc-examples-keycloak-oidc-idp-advanced.png" alt="Advanced Settings">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Next, you will need to add two mappers to store the &lt;code>voperson_id&lt;/code> and the
&lt;code>eduperson_entitlement&lt;/code> claims because Keycloak can map only the
&lt;a href="https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims">standard claims&lt;/a>.
Go to the &amp;ldquo;Mappers&amp;rdquo; tab and then click on &amp;ldquo;Add Mapper&amp;rdquo;.&lt;/p>
&lt;p>For the &lt;code>voperson_id&lt;/code> claim you will need to add the following options:&lt;/p>
&lt;ul>
&lt;li>Name: &lt;code>voPersonID&lt;/code>&lt;/li>
&lt;li>Sync Mode Override: &lt;code>import&lt;/code>&lt;/li>
&lt;li>Mapper Type: &lt;code>Username Template Importer&lt;/code>&lt;/li>
&lt;li>Template: &lt;code>${CLAIM.voperson_id}&lt;/code>&lt;/li>
&lt;li>Target: &lt;code>LOCAL&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="oidc-examples-keycloak-oidc-voperson-id-mapper.png" alt="voPersonID mapper">&lt;/p>
&lt;p>And for the &lt;code>eduperson_entitlement&lt;/code> claim:&lt;/p>
&lt;ul>
&lt;li>Name: &lt;code>eduPersonEntitlement&lt;/code>&lt;/li>
&lt;li>Sync Mode Override: &lt;code>Inherit&lt;/code>&lt;/li>
&lt;li>Mapper Type: &lt;code>Attribute Importer&lt;/code>&lt;/li>
&lt;li>Claim: &lt;code>eduperson_entitlement&lt;/code>&lt;/li>
&lt;li>User Attribute Name: &lt;code>eduPersonEntitlement&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="oidc-examples-keycloak-oidc-eduperson-entitlement-mapper.png" alt="eduPersonEntitlement mapper">&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
For other
&lt;a href="#user-attributes">attributes&lt;/a>, create a mapper similar to the
&lt;code>eduPersonEntitlement&lt;/code> mapper.
&lt;/div>
&lt;/li>
&lt;/ol>
&lt;h4 id="simple-oidc-client-php">simple-oidc-client-php&lt;/h4>
&lt;p>In this guide we will demonstrate how to install and configure a
&lt;a href="https://github.com/rciam/simple-oidc-client-php">Simple OIDC Client&lt;/a>.&lt;/p>
&lt;h5 id="install-simple-oidc-client-php">Install simple-oidc-client-php&lt;/h5>
&lt;p>This guide assumes the Apache HTTP server has been installed and the document
root is &lt;code>/var/www/html&lt;/code>&lt;/p>
&lt;p>Move to the apache document root and download and extract
&lt;a href="https://github.com/rciam/simple-oidc-client-php/releases/download/v2.0.0/simple-oidc-client-php.tar.gz">simple-oidc-client-php.tar.gz&lt;/a>.&lt;/p>
&lt;h5 id="configure-client">Configure Client&lt;/h5>
&lt;p>Login to the &lt;a href="https://aai.egi.eu/federation">EGI Federation Registry&lt;/a>&lt;/p>
&lt;p>Then create a new service or edit your existing service. In &lt;code>General&lt;/code> tab fill
all the required fields. For &lt;code>Integration Environment&lt;/code> select &lt;code>Demo&lt;/code>. In
&lt;code>Protocol Specific&lt;/code> tab select as Protocol the &lt;code>OIDC Service&lt;/code> and then in the
&lt;code>Redirect URI(s)&lt;/code> insert your simple-oidc-client-php URL (e.g.
&lt;code>http://localhost/simple-oidc-client-php/refreshtoken.php&lt;/code>). This URL must link
to &lt;code>refreshtoken.php&lt;/code> which is located in simple-oidc-client-php directory.
Next, in &lt;code>Scope&lt;/code> select the scopes that your service needs. Then, submit the
form and self approve it. Finally you should get a pair of &lt;code>Client ID&lt;/code> and
&lt;code>Client Secret&lt;/code>.&lt;/p>
&lt;h5 id="configure-simple-oidc-client-php">Configure simple-oidc-client-php&lt;/h5>
&lt;p>Now that you have everything you need, you can configure your login settings. Go
to your terminal and open &lt;code>config.php&lt;/code> with your favourite text editor.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ vi simple-oidc-client-php/config.php
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s go quickly through the settings:&lt;/p>
&lt;ul>
&lt;li>&lt;code>title&lt;/code> required, the title on the navigation bar&lt;/li>
&lt;li>&lt;code>img&lt;/code> required, the source of the logo&lt;/li>
&lt;li>&lt;code>scope_info&lt;/code> optional, a message that informs the user for the application
requirements&lt;/li>
&lt;li>&lt;code>issuer&lt;/code> required, the base URL of our IdentityServer instance. This will
allow oidc-client to query the metadata endpoint so it can validate the tokens&lt;/li>
&lt;li>&lt;code>client_id&lt;/code> required, the ID of the client we want to use when hitting the
Authorization Endpoint&lt;/li>
&lt;li>&lt;code>client_secret&lt;/code> optional, a value the offers better security to the message
flow&lt;/li>
&lt;li>&lt;code>pkceCodeChallengeMethod&lt;/code> optional, a string that defines the code challenge
method for PKCE. Choose between &lt;code>plain&lt;/code> or &lt;code>S256&lt;/code>.&lt;/li>
&lt;li>&lt;code>redirect_url&lt;/code> required, the redirect URL where the client and the browser
agree to send and receive correspondingly the code&lt;/li>
&lt;li>&lt;code>scopesDefine&lt;/code> required, defines the scopes the client supports&lt;/li>
&lt;li>&lt;code>refresh_token_note&lt;/code> optional, info for the refresh token&lt;/li>
&lt;li>&lt;code>access_token_note&lt;/code> optional, info for the access token&lt;/li>
&lt;li>&lt;code>manage_token_note&lt;/code> optional, message the informs the user where can manage
his tokens&lt;/li>
&lt;li>&lt;code>manageTokens&lt;/code> optional, URL of the manage tokens service&lt;/li>
&lt;li>&lt;code>sessionName&lt;/code> required, define the name of the cookie session&lt;/li>
&lt;li>&lt;code>sessionLifetime&lt;/code> required, define the duration of the session. This must be
equal to the validity time of the access token.&lt;/li>
&lt;/ul>
&lt;p>You must change the followings options based on your Service configuration you
setup earlier:&lt;/p>
&lt;ul>
&lt;li>&lt;code>issuer&lt;/code>&lt;/li>
&lt;li>&lt;code>client_id&lt;/code>&lt;/li>
&lt;li>&lt;code>client_secret&lt;/code>&lt;/li>
&lt;li>&lt;code>redirect_url&lt;/code>&lt;/li>
&lt;li>&lt;code>scopesDefine&lt;/code>&lt;/li>
&lt;li>&lt;code>sessionName&lt;/code> (based on the installation path of the portal)&lt;/li>
&lt;/ul>
&lt;p>An example configuration follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">&amp;lt;?&lt;/span>&lt;span style="color:#000">php&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// index.php interface configuration
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#000">$title&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;Generate Tokens&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$img&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://clickhelp.co/images/feeds/blog/2016.05/keys.jpg&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$scope_info&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;This service requires the following permissions for your account:&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// Client configuration
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#000">$issuer&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;https://aai-demo.egi.eu/auth/realms/egi&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$client_id&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;CHANGE_ME&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$client_secret&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;CHANGE_ME&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// comment if you are using PKCE
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// $pkceCodeChallengeMethod = &amp;#34;S256&amp;#34;; // uncomment to use PKCE
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#000">$redirect_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;http://localhost/simple-oidc-client-php/refreshtoken.php&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// add scopes as keys and a friendly message of the scope as value
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#000">$scopesDefine&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">array&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#39;openid&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;log in using your identity&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#39;email&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;read your email address&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#39;profile&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;read your basic profile info&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">// refreshtoken.php interface configuration
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">&lt;/span>&lt;span style="color:#000">$refresh_token_note&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;NOTE: New refresh tokens expire in 12 months.&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$access_token_note&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;NOTE: New access tokens expire in 1 hour.&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$manage_token_note&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;You can manage your refresh tokens in the following link: &amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$manageTokens&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">$issuer&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;manage/user/services&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$sessionName&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;simple-oidc-client-php&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">$sessionLifetime&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">60&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">*&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">60&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#8f5902;font-style:italic">// must be equal to access token validation time in seconds
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="common-issues">Common issues&lt;/h4>
&lt;h5 id="error-messages-referring-to-missing-code_challenge-code_challenge_method-or-code_verifier-http-parameter">Error messages referring to missing &lt;code>code_challenge&lt;/code>, &lt;code>code_challenge_method&lt;/code> or &lt;code>code_verifier&lt;/code> HTTP parameter&lt;/h5>
&lt;p>If you get error messages containing the PKCE HTTP parameters, probably the PKCE
mode is enabled in your Service Configuration but the Application is not
performing the PKCE mode.&lt;/p>
&lt;p>To solve this, you need to follow the steps below:&lt;/p>
&lt;ol>
&lt;li>Login to &lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a>&lt;/li>
&lt;li>Open your Service Configuration&lt;/li>
&lt;li>Click on the “Protocol Specific” tab and scroll down to “Proof Key for Code
Exchange (PKCE) Code Challenge Method” and select “PKCE will not be used for
this service”&lt;/li>
&lt;li>Click on “Submit” to apply the reconfiguration request&lt;/li>
&lt;/ol>
&lt;h5 id="error-messages-referring-to-invalid_code">Error messages referring to &lt;code>invalid_code&lt;/code>&lt;/h5>
&lt;p>If you try to perform the Authorization Code flow and you get an &lt;code>invalid_code&lt;/code>
error message, probably the Application sends the Authorization Request to the
Authorization Endpoint of the Keycloak based EGI Check-in OP and then sends the
&lt;code>code&lt;/code> to the Token Endpoint of the MITREid Connect based EGI Check-in OP or
vice versa.&lt;/p>
&lt;p>To fix this you need to verify that you have updated all the OIDC Endpoints with
the Keycloak ones. You can find all the OIDC Endpoints of Keycloak in the
&lt;a href="#endpoints">Endpoint&lt;/a> table.&lt;/p>
&lt;h5 id="error-messages-referring-to-the-redirect_uri">Error messages referring to the &lt;code>redirect_uri&lt;/code>&lt;/h5>
&lt;p>If you try to perform the Authorization Code flow and you get an
&lt;code>invalid_redirect_uri&lt;/code> error, probably the &lt;code>redirect_uri&lt;/code> in the Authorization
Request mismatches with the Allowed Redirect URIs in the Service Configuration.&lt;/p>
&lt;p>To solve this, you need to follow the steps below:&lt;/p>
&lt;ol>
&lt;li>Login to &lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a>&lt;/li>
&lt;li>Open your Service Configuration&lt;/li>
&lt;li>Click on the “Protocol Specific” tab and in the “Redirect URI(s)” edit the
URI.&lt;/li>
&lt;li>Click on “Submit” to apply the reconfiguration request&lt;/li>
&lt;/ol>
&lt;h5 id="userinfo-invalid_token-or-401-unauthorized-error-response">UserInfo &lt;code>invalid_token&lt;/code> or &lt;code>401 Unauthorized&lt;/code> error response&lt;/h5>
&lt;p>If you are trying to make a request to the UserInfo Endpoint and the response
contains the &lt;code>invalid_token&lt;/code> error message, probably you are using an invalid
Token or the UserInfo Endpoint is wrong.&lt;/p>
&lt;p>To solve this, please make sure the that:&lt;/p>
&lt;ol>
&lt;li>You have obtained an Keycloak issued Access Token and you make a request to
the Keycloak based UserInfo Endpoint&lt;/li>
&lt;li>You have added the Access Token to the Authorization header of the request&lt;/li>
&lt;/ol>
&lt;h5 id="502-bad-gateway-error-after-redirecting-back-to-the-service">&lt;code>502 Bad Gateway&lt;/code> error after redirecting back to the Service&lt;/h5>
&lt;p>If you are using NGINX as a Reverse Proxy, and you are getting the following
error message in the logs:&lt;/p>
&lt;blockquote>
&lt;p>upstream sent too big header while reading response header from upstream&lt;/p>
&lt;/blockquote>
&lt;p>Then you need to increase the size of the buffer by adding the following options
in the vhost configuration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-nginx" data-lang="nginx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">proxy_buffers&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">4&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">256k&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">proxy_buffer_size&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">128k&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">proxy_busy_buffers_size&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">256k&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="size-of-the-tokens">Size of the Tokens&lt;/h5>
&lt;p>The size of an Access Token is around 1400 characters, depending on the
information (claims) included in the payload of the JWT. So make sure that
your OIDC implementation can handle large Tokens.&lt;/p>
&lt;h5 id="token-introspection-errors">Token Introspection errors&lt;/h5>
&lt;p>The Token Introspection is available to all the clients that are using any
authentication method (&lt;code>client_secret_basic&lt;/code>, &lt;code>client_secret_post&lt;/code>,
&lt;code>client_secret_jwt&lt;/code> or &lt;code>private_key_jwt&lt;/code>) (Confidential Clients) to the Token
Endpoint. Public Clients (clients that do not use any authentication method)
will not be able to get a successful response from the Introspection Endpoint.&lt;/p>
&lt;h5 id="pkce-errors">PKCE errors&lt;/h5>
&lt;p>If you are &lt;strong>not&lt;/strong> using PKCE (Proof Key for Code Exchange), please make sure to
&lt;strong>disable&lt;/strong> the &amp;ldquo;PKCE Code Challenge Method&amp;rdquo; in the Service configuration in
&lt;a href="https://aai.egi.eu/federation">EGI Federation Registry&lt;/a>, otherwise you will get
the following HTTP response during the authentication flow:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-http" data-lang="http">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a40000">error=invalid_request&amp;amp;error_description=Missing parameter: code_challenge_method
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="device-code-grant">Device Code Grant&lt;/h5>
&lt;p>If you are using a confidential client with the Device Code grant, please make
sure that the &lt;code>client_secret&lt;/code> is present in the request to the Device Code
Endpoint either as HTTP Basic or HTTP POST parameter (see
&lt;a href="#1-device-authorization-request">Device Authorization Request&lt;/a>).&lt;/p>
&lt;h5 id="token-exchange-grant">Token Exchange Grant&lt;/h5>
&lt;p>If you are using the Token Exchange grant, please make sure that the &lt;code>audience&lt;/code>
(Optional) defines the logical name of the service that the token will be used
for; when specified, it must match the client ID of a client registered in
Check-in otherwise an &lt;code>invalid_client&lt;/code> error is returned
(&lt;code>&amp;quot;description&amp;quot;: &amp;quot;audience not found&amp;quot;&lt;/code>)&lt;/p>
&lt;h2 id="integrating-science-gateways-with-rcauth-for-obtaining-proxy-certificates">Integrating Science Gateways with RCauth for obtaining (proxy) certificates&lt;/h2>
&lt;p>In order for Science Gateways (VO portals) to obtain RFC proxy certificates
derived from &lt;strong>personal&lt;/strong> end-entity certificates, an EGI Science Gateway can
make use of the IGTF-approved IOTA-type RCauth.eu online CA. The actual
integration goes via an intermediary service, called a Master Portal. EGI is
running two Master Portal instances, one development, one production instance.&lt;/p>
&lt;ul class="nav nav-tabs" id="tabs-26" role="tablist">
&lt;li class="nav-item">
&lt;a class="nav-link active"
id="tabs-26-0-tab" data-toggle="tab" href="#tabs-26-0" role="tab"
aria-controls="tabs-26-0" aria-selected="true">
Production
&lt;/a>
&lt;/li>
&lt;li class="nav-item">
&lt;a class="nav-link"
id="tabs-26-1-tab" data-toggle="tab" href="#tabs-26-1" role="tab"
aria-controls="tabs-26-1" aria-selected="false">
Development
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="tabx-content" id="tabs-26-content">
&lt;div class="tab-pane show active"
id="tabs-26-0" role="tabpanel" aria-labelled-by="tabs-26-0-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoint&lt;/th>
&lt;th>Production environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Provider configuration&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/.well-known/openid-configuration">https://aai.egi.eu/mp-oa2-server/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Client registration&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/register">https://aai.egi.eu/mp-oa2-server/register&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Authorization&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/authorize">https://aai.egi.eu/mp-oa2-server/authorize&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/token">https://aai.egi.eu/mp-oa2-server/token&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JSON Web Key Sets(JWKS)&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/certs">https://aai.egi.eu/mp-oa2-server/certs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UserInfo&lt;/td>
&lt;td>&lt;a href="https://aai.egi.eu/mp-oa2-server/userinfo">https://aai.egi.eu/mp-oa2-server/userinfo&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="tab-pane "
id="tabs-26-1" role="tabpanel" aria-labelled-by="tabs-26-1-tab">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoint&lt;/th>
&lt;th>Development environment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Provider configuration&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/.well-known/openid-configuration">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/.well-known/openid-configuration&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Client registration&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/register">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/register&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Authorization&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/authorize">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/authorize&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/token">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/token&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JSON Web Key Sets(JWKS)&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/certs">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/certs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UserInfo&lt;/td>
&lt;td>&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/userinfo">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/userinfo&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;h3 id="registering-a-client-at-the-master-portal">Registering a client at the Master Portal&lt;/h3>
&lt;p>In order to register a new client for your VO portal go to:&lt;/p>
&lt;ul>
&lt;li>EGI Development instance:
&lt;a href="https://masterportal-pilot.aai.egi.eu/mp-oa2-server/register">https://masterportal-pilot.aai.egi.eu/mp-oa2-server/register&lt;/a>&lt;/li>
&lt;li>EGI Production instance: &lt;a href="https://aai.egi.eu/mp-oa2-server/register">https://aai.egi.eu/mp-oa2-server/register&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Make sure to store the &lt;code>client_id&lt;/code> and
&lt;code>client_secret&lt;/code> in a secure place
&lt;/div>
&lt;p>In order to get the client approved, send an email to the administrator of the
EGI Master Portal using &lt;code>checkin-support&lt;/code> &lt;code>&amp;lt;AT&amp;gt;&lt;/code> &lt;code>mailman.egi.eu&lt;/code>.&lt;/p>
&lt;h4 id="detailed-information">Detailed information&lt;/h4>
&lt;p>For further and detailed instructions on the integration flow, see the generic
&lt;a href="https://wiki.nikhef.nl/grid/RCauth.eu_and_MasterPortal_VOPortal_integration_guide">RCAuth.eu MasterPortal VOPortal integration guide&lt;/a>&lt;/p>
&lt;h4 id="ssh-key-authentication-for-proxy-retrieval">SSH key authentication for proxy retrieval&lt;/h4>
&lt;p>The EGI MasterPortal also allows users to authenticate using &lt;em>SSH key pair&lt;/em>, in
order to retrieve proxy certificates from the MasterPortal. Users need to first
upload the public key via a self-service portal, &lt;a href="https://aai.egi.eu/sshkeys/">https://aai.egi.eu/sshkeys/&lt;/a>.
About once a week they need to follow a web-flow to ensure a long-lived proxy
certificate is present in MasterPortal, e.g. by going to
&lt;a href="https://aai.egi.eu/vo-portal/">https://aai.egi.eu/vo-portal/&lt;/a>. They can then obtain a proxy certificate by
doing&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ ssh proxy@ssh.aai.egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>and storing the output in &lt;code>/tmp/x509up_u$(id -u)&lt;/code>&lt;/p>
&lt;p>Generic information for users on how to do this can be found at
&lt;a href="https://wiki.nikhef.nl/grid/RCauth.eu_and_MasterPortal_SSH_Key_Portal">Instructions for end users on how to use the SSH key authN for proxy retrieval&lt;/a>.
Alternatively VO portals could implement such functionality themselves by using
the API described at the
&lt;a href="https://wiki.nikhef.nl/grid/Master_Portal_sshkey_endpoint">Master Portal sshkey endpoint description&lt;/a>.&lt;/p>
&lt;h2 id="user-attributes">User attributes&lt;/h2>
&lt;p>This section defines the attributes that can be made available to services
connected to Check-in.&lt;/p>
&lt;!-- markdownlint-disable no-inline-html -->
&lt;h3 id="1-community-user-identifier">1. Community User Identifier&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Community User Identifier&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The User’s Community Identifier is a globally unique, opaque, persistent and non-reassignable identifier identifying the user. For users whose community identity is managed by Check-in, this identifier is of the form &lt;code>&amp;lt;uniqueID&amp;gt;@egi.eu&lt;/code>. The &lt;code>&amp;lt;uniqueID&amp;gt;&lt;/code> portion is an opaque identifier issued by Check-in&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.6&lt;/code> (voPersonID)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>voperson_id&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_id&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>ID token&lt;/li>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The Community User Identifier is assigned by Check-in or an external AAI service managing the community identity of the user&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>ef72285491ffe53c39b75bdcef46689f5d26ddfa00312365cc4fb5ce97e9ca87@egi.eu&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Use &lt;strong>Community User Identifier&lt;/strong> within your application as the unique-identifier key for the user. Obtaining the Community User Identifier from the &lt;code>sub&lt;/code> claim using the &lt;code>openid&lt;/code> scope for OIDC Relying Parties or from &lt;code>eduPersonUniqueId&lt;/code> for SAML Service Providers has been deprecated. OIDC RPs should request either the &lt;code>voperson_id&lt;/code> or &lt;code>aarc&lt;/code> scope to obtain the Community User Identifier. SAML PRs should request the &lt;code>voPersonID&lt;/code> attribute to obtain the Community User Identifier.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="2-display-name">2. Display Name&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Display Name&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s full name, in a displayable form&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:2.16.840.1.113730.3.1.241&lt;/code> (displayName)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>profile&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provided by user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>John Doe&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="3-given-name">3. Given Name&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Given Name&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s first name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:2.5.4.42&lt;/code> (givenName)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>profile&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>given_name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provided by user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>John&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="4-family-name">4. Family Name&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Family Name&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s last name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:2.5.4.4&lt;/code> (sn)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>profile&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>family_name&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provided by user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>Doe&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="5-username">5. Username&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Username&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The username by which the user wishes to be referred to&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:0.9.2342.19200300.100.1.1&lt;/code> (uid)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>profile&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>preferred_username&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>ID token&lt;/li>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in assigns this attribute on user registration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>jdoe&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The Service Provider &lt;strong>MUST NOT&lt;/strong> rely upon this value being unique&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="6-email-address">6. Email Address&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Email Address&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s email address&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:0.9.2342.19200300.100.1.3&lt;/code> (mail)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>email&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>email&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provided by user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>john.doe@example.org&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">This &lt;strong>MAY NOT&lt;/strong> be unique and is &lt;strong>NOT&lt;/strong> suitable for use as a primary key&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="7-verified-email-flag">7. Verified email flag&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Verified email flag&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">True if the user&amp;rsquo;s email address has been verified; otherwise false&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">See &lt;a href="#8-verified-email-list">Verified email list&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>email&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>email_verified&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in assigns this attribute on user registration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>true&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">This claim is available only in OpenID Connect&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="8-verified-email-list">8. Verified email list&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Verified email list&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">A list of user&amp;rsquo;s email addresses that have been verified&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.14&lt;/code> (voPersonVerifiedEmail)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>email&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_verified_email&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in or the user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>john.doe@example.org&lt;/code>&lt;/li>&lt;li>&lt;code>jdoe@example.com&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Experimental&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="9-affiliation">9. Affiliation&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Affiliation&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s affiliation within a particular security domain (scope)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.25178.4.1.11&lt;/code> (voPersonExternalAffiliation)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_external_affiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_external_affiliation&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">When available, this information originates from the user&amp;rsquo;s authenticating Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>member@example.org&lt;/code>&lt;/li>&lt;li>&lt;code>faculty@example.org&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Service Providers are encouraged to validate the scope of this attribute&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="10-groups">10. Groups&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Groups&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s group/VO membership/role information expressed as entitlements&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.7&lt;/code> (eduPersonEntitlement)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Group memberships are managed by group administrators&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>urn:mace:egi.eu:aai.egi.eu:member@fedcloud.egi.eu&lt;/code>&lt;/li>&lt;li>&lt;code>urn:mace:egi.eu:aai.egi.eu:vm_operator@fedcloud.egi.eu&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="11-capabilities">11. Capabilities&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Capabilities&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">This attribute describes the resource or child-resource a user is allowed to access, optionally specifying certain actions the user is entitled to perform, as described in &lt;a href="https://aarc-community.org/guidelines/aarc-g027/">AARC-G027&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.7&lt;/code> (eduPersonEntitlement)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Capabilities are managed by Check-in&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>urn:mace:egi.eu:res:rcauth#aai.egi.eu&lt;/code>&lt;/li>&lt;li>&lt;code>urn:mace:egi.eu:res:gocdb#aai.egi.eu&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="12-gocdb-roles">12. GOCDB Roles&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">GOCDB Roles&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The user&amp;rsquo;s GOCDB role information expressed as entitlements&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.7&lt;/code> (eduPersonEntitlement)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The roles are managed in GOCDB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>urn:mace:egi.eu:goc.egi.eu:100453G0:GRIDOPS-CheckIn:Site+Administrator@egi.eu&lt;/code>&lt;/li>&lt;li>&lt;code>urn:mace:egi.eu:goc.egi.eu:92503G08:GRIDOPS-MON:Site+Operations+Manager@egi.eu&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="13-assurance">13. Assurance&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Assurance&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Assurance of the identity of the user, following &lt;a href="https://refeds.org/assurance">REFEDS Assurance Framework (RAF)&lt;/a> and the &lt;a href="https://docs.egi.eu/providers/check-in/sp/#level-of-assurance">EGI AAI Assurance Profiles&lt;/a>. The following RAF values are qualified and automatically set for all Community identities:&lt;ul>&lt;li>$PREFIX$&lt;/li>&lt;li>$PREFIX$/ID/unique&lt;/li>&lt;li>$PREFIX$/ID/eppn-unique-no-reassign&lt;/li>&lt;li>$PREFIX$/IAP/low&lt;/li>&lt;li>$PREFIX$/ATP/ePA-1m&lt;/li>&lt;li>$PREFIX$/ATP/ePA-1d&lt;/li>&lt;/ul>Following RAF values are set if the currently used authentication provider asserts (or otherwise qualifies to) them:&lt;/br>&lt;ul>&lt;li>$PREFIX$/IAP/medium&lt;/li>&lt;li>$PREFIX$/IAP/high&lt;/li>&lt;/ul>The following compound profiles are asserted if the user qualifies to them&lt;/br>&lt;ul>&lt;li>$PREFIX$/profile/cappuccino&lt;/li>&lt;li>$PREFIX$/profile/espresso&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.11&lt;/code> (eduPersonAssurance)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>openid&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>eduperson_assurance&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in assigns this attribute on user registration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>https://aai.egi.eu/LoA#Low&lt;/code>&lt;/li>&lt;li>&lt;code>https://refeds.org/assurance/IAP/low&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="14-certentitlement">14. CertEntitlement&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">CertEntitlement&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provides information about the user&amp;rsquo;s certificate subject(s) and the associated VO(s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Not available&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>cert_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>cert_entitlement&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>UserInfo Endpoint&lt;/li>&lt;li>Introspection Endpoint&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">VO/group management tools integrated with Check-in&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>[{&amp;quot;cert_subject_dn&amp;quot;: &amp;quot;/C=GR/O=HellasGrid/...&amp;quot;,&amp;quot;cert_iss&amp;quot;: &amp;quot;/C=GR/O=HellasGrid/...&amp;quot;,&amp;quot;eduperson_entitlement&amp;quot;: &amp;quot;urn:mace:egi.eu:group:checkin-integration:role=VO-Admin#aai.egi.eu&amp;quot;}]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">This is available only for DIRAC&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="15-ssh-public-key">15. SSH Public Key&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">SSH Public Key&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provides information about the user&amp;rsquo;s SSH public key(s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.24552.500.1.1.1.13&lt;/code> (sshPublicKey)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>ssh_public_key&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>ssh_public_key&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Added SSH public key(s) in user&amp;rsquo;s Check-in Profile&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>ssh-rsa AAAAB3NzaC...qxxEEipdnZ jdoe@grnet-hq.admin.grnet.gr&lt;/code>&lt;/li>&lt;li>&lt;code>ssh-rsa AAAA4xzdIf...fxgsRDfgAt jdoe@example.org&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Experimental&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- textlint-disable -->
&lt;h3 id="16-orcid-id">16. ORCID iD&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">ORCID iD&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Provides information about the user&amp;rsquo;s ORCID iD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>urn:oid:1.3.6.1.4.1.5923.1.1.1.16&lt;/code> (eduPersonOrcid)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>orcid&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>orcid&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">ORCID Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Single-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>https://orcid.org/XXXX-XXXX-XXXX-XXXX&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The attribute is available when logging in using ORCID&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Experimental&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- textlint-enable -->
&lt;h3 id="17-subject-distinguished-name-dn-of-users-x509-certificate">17. Subject Distinguished Name (DN) of user&amp;rsquo;s X.509 certificate&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Subject Distinguished Name (DN) of user&amp;rsquo;s X.509 certificate&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The Subject Distinguished Name of an X.509 certificate held by the person.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>1.3.6.1.4.1.25178.4.1.3&lt;/code> (voPersonCertificateDN)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>voperson_certificate&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_certificate_dn&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in or the user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>/C=XX/O=YYY/OU=ZZZ/CN=John Doe&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Experimental&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="18-issuer-distinguished-name-dn-of-users-x509-certificate">18. Issuer Distinguished Name (DN) of user&amp;rsquo;s X.509 certificate&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">attribute name&lt;/th>
&lt;th style="text-align:left">Issuer Distinguished Name (DN) of user&amp;rsquo;s X.509 certificate&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>description&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The Subject Distinguished Name of the X.509 certificate issuer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>SAML Attribute(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>1.3.6.1.4.1.25178.4.1.4&lt;/code> (voPersonCertificateIssuerDN)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC scope&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;ul>&lt;li>&lt;code>voperson_certificate&lt;/code>&lt;/li>&lt;li>&lt;code>aarc&lt;/code>&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim(s)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>voperson_certificate_issuer_dn&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>OIDC claim location&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UserInfo Endpoint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>origin&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Check-in or the user&amp;rsquo;s Identity Provider&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>changes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>multiplicity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multi-valued&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Not always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>/C=XX/O=YYY/OU=ZZZ/CN=Example CA&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>notes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">&lt;strong>status&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Experimental&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- markdownlint-enable no-inline-html -->
&lt;h2 id="user-authorisation">User authorisation&lt;/h2>
&lt;p>The following information about the authenticated user can be provided by EGI
Check-in in order to control user access to resources:&lt;/p>
&lt;ol>
&lt;li>VO/group membership and role information about the authenticated user&lt;/li>
&lt;li>Capabilities&lt;/li>
&lt;li>Identity Assurance&lt;/li>
&lt;li>GOCDB roles&lt;/li>
&lt;/ol>
&lt;h3 id="vogroup-membership-and-role-information">VO/group membership and role information&lt;/h3>
&lt;h4 id="background">Background&lt;/h4>
&lt;p>VO/group membership and role information is encoded in entitlements
(&lt;code>eduPersonEntitlement&lt;/code> attribute values in SAML or &lt;code>eduperson_entitlement&lt;/code>
claim in OIDC). These entitlements are typically used to indicate access rights
to protected resources. Entitlements are multi-valued, with each value formatted
as a URN.&lt;/p>
&lt;h4 id="syntax">Syntax&lt;/h4>
&lt;p>An entitlement value expressing group membership and role information has the
following syntax (components enclosed in square brackets are OPTIONAL):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>urn:mace:egi.eu:group:&amp;lt;GROUP&amp;gt;[:&amp;lt;SUBGROUP&amp;gt;*][:role=&amp;lt;ROLE&amp;gt;]#&amp;lt;GROUP-AUTHORITY&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;GROUP&amp;gt;&lt;/code> is the name of a VO, research collaboration or a top level arbitrary
group. &lt;code>&amp;lt;GROUP&amp;gt;&lt;/code> names are unique within the &lt;code>urn:mace:egi.eu:group&lt;/code>
namespace;&lt;/li>
&lt;li>zero or more &lt;code>&amp;lt;SUBGROUP&amp;gt;&lt;/code> components represent the hierarchy of subgroups in
the &lt;code>&amp;lt;GROUP&amp;gt;&lt;/code>; specifying sub-groups is optional&lt;/li>
&lt;li>the optional &lt;code>&amp;lt;ROLE&amp;gt;&lt;/code> component is scoped to the rightmost (sub)group; if no
group information is specified, the role applies to the VO&lt;/li>
&lt;li>&lt;code>&amp;lt;GROUP-AUTHORITY&amp;gt;&lt;/code> is a non-empty string that indicates the authoritative
source for the entitlement value. For example, it can be the FQDN of the group
management system that is responsible for the identified group membership
information&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>urn:mace:egi.eu:group:fedcloud.egi.eu:role=vm_operator#aai.egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="capabilities">Capabilities&lt;/h3>
&lt;h4 id="background-1">Background&lt;/h4>
&lt;p>The user&amp;rsquo;s capability information is encoded in entitlements
(&lt;code>eduPersonEntitlement&lt;/code> attribute values in SAML or &lt;code>eduperson_entitlement&lt;/code>
claim in OIDC). These entitlements are typically used to indicate access rights
to protected resources. Entitlements are multi-valued, with each value formatted
as a URN following the syntax defined in
&lt;a href="https://aarc-community.org/guidelines/aarc-g027/">AARC-G027&lt;/a>.&lt;/p>
&lt;h4 id="syntax-1">Syntax&lt;/h4>
&lt;p>An entitlement value expressing a capability has the following syntax
(components enclosed in square brackets are OPTIONAL):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>&amp;lt;NAMESPACE&amp;gt;:res:&amp;lt;RESOURCE&amp;gt;[:&amp;lt;CHILD-RESOURCE&amp;gt;]...[:act:&amp;lt;ACTION&amp;gt;[,&amp;lt;ACTION&amp;gt;]...]#&amp;lt;AUTHORITY&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>&amp;lt;NAMESPACE&amp;gt;&lt;/code> is controlled by the e-infrastructure, research infrastructure
or research collaboration that manages the capability. The &lt;code>&amp;lt;NAMESPACE&amp;gt;&lt;/code> of
capabilities managed by Check-in is set to &lt;code>urn:mace:egi.eu&lt;/code>, while,
generally, it is in the form of
&lt;code>urn:&amp;lt;NID&amp;gt;:&amp;lt;DELEGATED-NAMESPACE&amp;gt;[:&amp;lt;SUBNAMESPACE&amp;gt;]...&lt;/code> where:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>&amp;lt;NID&amp;gt;&lt;/code> is the namespace identifier associated with a URN namespace
registered with IANA2, ensuring global uniqueness. Implementers SHOULD use
one of the existing registered URN namespaces, such as
&lt;code>urn:mace&lt;/code>[&lt;a href="https://incommon.org/community/mace-registries/mace-urn-registry/">MACE&lt;/a>].&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>&amp;lt;DELEGATED-NAMESPACE&amp;gt;&lt;/code> is a URN sub-namespace delegated from one of the
IANA registered NIDs to an organisation representing the e-infrastructure,
research infrastructure or research collaboration. It is RECOMMENDED that a
publicly accessible URN value registry for each delegated namespace be
provided.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>The literal string &lt;code>&amp;quot;res&amp;quot;&lt;/code> indicates that this is a resource-specific
entitlement as opposed to, for example, an entitlement used for expressing
group membership
&lt;a href="https://aarc-community.org/guidelines/aarc-g002/">AARC-G002&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>&amp;lt;RESOURCE&amp;gt;&lt;/code> is the name of the resource. Whether the name should be unique is
an implementation decision.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>An optional list of colon-separated &lt;code>&amp;lt;CHILD-RESOURCE&amp;gt;&lt;/code> components represents a
specific branch of the hierarchy of resources under the identified
&lt;code>&amp;lt;RESOURCE&amp;gt;&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>An optional list of comma-separated &lt;code>&amp;lt;ACTION&amp;gt;&lt;/code>s MAY be included, which, if
present, MUST be prefixed with the literal string “act”. This component MAY be
used for further specifying the actions a user is entitled to do at a given
resource. Note that the list of &lt;code>&amp;lt;ACTION&amp;gt;&lt;/code>s is scoped to the rightmost
child-resource; if no child-resource information is specified, actions apply
to the top level resource. The interpretation of a capability without actions
specified is an implementation detail.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>&amp;lt;AUTHORITY&amp;gt;&lt;/code> is a mandatory and non-empty string that indicates the
authoritative source of the capability. This SHOULD be used to further specify
the exact issuing instance. For example, it MAY be the FQDN of the service
that issued that specific capability. The &lt;code>&amp;lt;AUTHORITY&amp;gt;&lt;/code> is specified in the
f-component &lt;a href="https://tools.ietf.org/html/rfc8141">RFC8141&lt;/a> of the URN; thus,
it is introduced by the number sign (&amp;quot;#&amp;quot;) character and terminated by the end
of the URN. All characters must be encoded according to
&lt;a href="https://tools.ietf.org/html/rfc8141">RFC8141&lt;/a>. Hence, the &lt;code>&amp;lt;AUTHORITY&amp;gt;&lt;/code> MUST
NOT be considered when determining equivalence (Section 3 in
&lt;a href="https://tools.ietf.org/html/rfc8141">RFC8141&lt;/a>) of URN-formatted capabilities.
The &lt;code>&amp;lt;AUTHORITY&amp;gt;&lt;/code> of capabilities managed by Check-in is typically set to
&lt;code>aai.egi.eu&lt;/code>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>urn:mace:egi.eu:res:rcauth#aai.egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="identity-assurance">Identity Assurance&lt;/h3>
&lt;p>Based on the authentication method selected by the user, the EGI proxy assigns a
Identity Assurance, which is conveyed to the SP through both the
&lt;code>eduPersonAssurance&lt;/code> attribute and the Authentication Context Class
(&lt;code>AuthnContextClassRef&lt;/code>) of the SAML authentication response. EGI Check-in uses
Assurance Profiles which distinguish between three Identity Assurance levels,
similarly to the
&lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=OJ:JOL_2015_235_R_0002">eID Assurance Framework (eIDAF)&lt;/a>.
Each level is represented by a URI as follows:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Low&lt;/strong>: Authentication through a social identity provider or other low
identity assurance provider: &lt;code>https://aai.egi.eu/LoA#Low&lt;/code>&lt;/li>
&lt;li>&lt;strong>Substantial&lt;/strong>: Password/X.509 authentication at the user's home IdP:
&lt;code>https://aai.egi.eu/LoA#Substantial&lt;/code>&lt;/li>
&lt;li>&lt;strong>High&lt;/strong>: Substantial + multi-factor authn (not yet supported, TBD):
&lt;code>https://aai.egi.eu/LoA#High&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Moreover, EGI Check-in follows the
&lt;a href="https://wiki.refeds.org/display/ASS/REFEDS+Assurance+Framework+ver+1.0">REFEDS Assurance framework (RAF)&lt;/a>.
The EGI Check-in conveys any RAF values provided by the IdP directly to the SP,
through the aforementioned methods. Furthermore, Check-in will append into the
User&amp;rsquo;s profile any additional LoA, if the user is eligible for it. For example,
a user having a Verified Email is eligible for the RAF value
&lt;code>https://refeds.org/assurance/IAP/low&lt;/code>&lt;/p>
&lt;p>Some EGI SPs have been configured to provide limited access (or not to accept at
all) credentials with the Low LoA.&lt;/p>
&lt;p>Note: When logging in through the EGI SSO IdP, the LoA is determined based on
the selected authentication mechanism as follows:&lt;/p>
&lt;ul>
&lt;li>Username/password credentials → Low&lt;/li>
&lt;li>X.509 certification → Substantial&lt;/li>
&lt;/ul>
&lt;h3 id="gocdb-roles">GOCDB Roles&lt;/h3>
&lt;h4 id="background-2">Background&lt;/h4>
&lt;p>GOCDB roles, as per
&lt;a href="https://wiki.egi.eu/wiki/GOCDB/PI/get_user_method">GOCDB documentations&lt;/a>, are
encoded (&lt;code>eduPersonEntitlement&lt;/code> attribute values in SAML or
&lt;code>eduperson_entitlement&lt;/code> claim in OIDC). These entitlements are typically used to
indicate access rights to protected resources. Entitlements are multi-valued,
with each value formatted as a URN.&lt;/p>
&lt;h4 id="syntax-2">Syntax&lt;/h4>
&lt;p>An entitlement value expressing GOCDB roles has the following syntax (components
enclosed in square brackets are OPTIONAL):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>urn:mace:egi.eu:goc.egi.eu:&amp;lt;PRIMARY_KEY&amp;gt;:&amp;lt;ON_ENTITY&amp;gt;:&amp;lt;USER_ROLE&amp;gt;@egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;PRIMARY_KEY&amp;gt;&lt;/code> is the primary key for the user role, e.g. &amp;ldquo;123G0&amp;rdquo;&lt;/li>
&lt;li>&lt;code>&amp;lt;ON_ENTITY&amp;gt;&lt;/code> is the name of the entity on which the user role applies to,
e.g. &amp;ldquo;GRIDOPS-GOCDB&amp;rdquo;&lt;/li>
&lt;li>&lt;code>&amp;lt;USER_ROLE&amp;gt;&lt;/code> is the user&amp;rsquo;s role, e.g. &amp;ldquo;Site Operations Manager&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>urn:mace:egi.eu:goc.egi.eu:100453G0:GRIDOPS-CheckIn:Site+Administrator@egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>