European Student Identifier

Acesso aos serviços de mobilidade Erasmus+ utilizando a conta institucional via eduGAIN

Cartão de Estudante Europeu


A iniciativa do Cartão de Estudante Europeu tem como objetivo permitir a todos os estudantes, a identificação e matrícula, por via eletrónica, em qualquer instituição do ensino superior europeu, de uma forma fácil e segura. Assim, quando os alunos forem estudar para o estrangeiro, pretende-se eliminar os procedimentos de registo a necessidade da circulação de papel entre as instituições.

No âmbito desta iniciativa, a Comissão Europeia estabeleceu um caminho de digitalização para todos os serviços relacionados com o programa Erasmus+. Como parte integrante da digitalização deste programa, serão adicionados de forma gradual os serviços de mobilidade (Erasmus+ App ou Online Learning Agreement) na federação eduGAIN, garantindo que:

  • Os estudantes autenticam-se utilizando as credenciais da sua instituição de origem.
  • Os serviços recebem a informação necessária sobre estudantes em mobilidade (European Student Identifier, informação de contacto, instituição de origem)

MyAcademicID


O acesso aos serviços Erasmus+ é agora possível através do projeto MyAcademicID, que fornece um ponto único de acesso (proxy) aos fornecedores de identidade integrados na confederação eduGAIN.

Desta forma, as instituições apenas necessitam de configurar um único fornecedor de serviço (proxy MyAcademicID), para acesso a todos os serviços relacionados com o Erasmus+.

Este fornecedor de serviço é representado pelo seguinte EntityID:

Configurar MyAcademicID


Para que possam utilizar o proxy MyAcademicID é necessário pertencer à RCTSaai e ao eduGAIN. Se a sua instituição não se encontra no eduGAIN, consulte o link Fornecedor de Identidade no eduGAIN e saiba como aderir.

As instituições membro da RCTSaai e integradas no eduGAIN, para utilização dos serviços Erasmus+, devem libertar o seguinte conjunto de atributos para o proxy MyAcademicID:

Informação de Nomes

  • givenName + sn; e/ou
  • commonName e/ou
  • displayName ;

Atributos de Autorização

  • eduPersonScopedAffiliation

Identificadores

  • email
  • eduPersonPrincipalName ou eduPersonTargetID / persistentID
  • schacPersonalUniqueCode

Organização

  • schacHomeOrganization

Com excepção do atributo schacPersonalUniqueCode, os restantes atributos já se encontram configurados no seu Fornecedor de Identidade por já se encontrar no eduGAIN, uma vez que a configuração dos mesmo é um requisito para acesso a serviços eduGAIN.

schacPersonalUniqueCode

Este atributo será utilizado para transportar o "European Student Identifier”.

O “European Student Identifier” é um identificador globalmente único, persistente e “non-targeted” (permanece o mesmo para todos os fornecedores de serviço).

A especificação ESI, prevê que este identificador seja transportado na federação através do atributo schacPersonalUniqueCode, e suporta dois formatos:

  • Por País (Utilizado por países que suportam um identificador nacional de estudante)
  • Por Instituição (Formato obrigatório a utilizar na RCTSaai)

Na RCTSaai a construção do “European Student Identifier” terá o formato Institucional.

Na RCTSaai o "European Student Identifier" será constituído da seguinte forma:

  • 1ª parte – URN Namespace (Fixo)

  • 2ª Parte – Corresponderá ao domínio da instituição, mais concretamente ao valor do respetivo atributo schacHomeOrganization

  • 3ª Parte – Identificador único do estudante na instituição (ex.: número mecanográfico do estudante na instituição)

Exemplo do formato ESI para Universidade dos Açores

urn:schac:personalUniqueCode:int:esi:uac.pt:3234234923

As especificações completas do ESI estão disponíveis na wiki do GÉANT:

Uma vez que este atributo, muito provavelmente, não existe neste formato nas respetivas ActiveDirectory ou LDAP das instituições, elaboramos alguns cenários e respetivo exemplo de configuração deste atributo.

CENARIO 1 – Mapeamento do Identificador Único com base num atributo que corresponde integralmente ao identificador do estudante na instituição

Neste cenário o atributo uid corresponderá ao número mecanográfico do estudante na instituição. Pode ser utilizado outro atributo, desde que esse corresponda ao identificador do estudante na instituição (ex.: sAMAccountName)

Exemplo para IdP's Shibboleth versão superior ou igual a 3.4

Ficheiro: /opt/shibboleth-idp/conf/attribute-resolver-interfederation-core.xml

<AttributeDefinition id="schacPersonalUniqueCode" xsi:type="Template">

    <InputDataConnector ref="myLDAP" attributeNames="uid" />

    <DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</DisplayName>
    <DisplayName xml:lang="en">European Student Identifier (ESI)</DisplayName>

    <Template>urn:schac:personalUniqueCode:int:esi:%{idp.scope}:${uid}</Template>

    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" encodeType="false" />

</AttributeDefinition>

Exemplo para IdP Shibboleth versão inferior ou igual a 3.3

Ficheiro: /opt/shibboleth-idp/conf/attribute-resolver-interfederation-core.xml

 <resolver:AttributeDefinition id="schacPersonalUniqueCode" xsi:type="ad:Template" >

    <resolver:Dependency ref="myLDAP" />

    <resolver:DisplayName xml:lang="en">European Student Identifier (ESI)</resolver:DisplayName>
    <resolver:DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</resolver:DisplayName>

    <resolver:AttributeEncoder xsi:type="enc:SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" />

    <ad:Template>urn:schac:personalUniqueCode:int:esi:%{idp.scope}:${uid}</ad:Template>
    <ad:SourceAttribute>uid</ad:SourceAttribute>

</resolver:AttributeDefinition>

CENARIO 2 – Mapeamento do Identificador Único com base num atributo que corresponde parcialmente ao identificador do estudante na instituição

Neste exemplo é demonstrado como se pode utilizar uma expressão regular sobre o atributo uid para mapear o atributo ESI.

Exemplo para IdP's Shibboleth versão superior ou igual a 3.4

Ficheiro: /opt/shibboleth-idp/conf/attribute-resolver-interfederation-core.xml

<AttributeDefinition id="schacPersonalUniqueCode" xsi:type="Mapped">

    <InputDataConnector ref="myLDAP" attributeNames="uid" />

    <DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</DisplayName>
    <DisplayName xml:lang="en">European Student Identifier (ESI)</DisplayName>

    <ValueMap>
        <ReturnValue>urn:schac:personalUniqueCode:int:esi:%{idp.scope}:$1</ReturnValue>
        <SourceValue>^x([0-9]{8,})$</SourceValue>
    </ValueMap>

    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" encodeType="false" />

</AttributeDefinition>

Filtro para o schacPersonalUniqueCode

O Fornecedor de Serviço https://proxy.prod.erasmus.eduteams.org/metadata/backend.xml suporta na respetiva metadata as categorias “REFEDS Research and Scholarship Entity Category” e “EU/EEA Data Protection Code of Conduct”.

Importante
Um fornecedor de Identidade que já se encontra no eduGAIN, obrigatóriamente suporta a configuração de envio de atributos com base em categorias. Recomendamos que confirmem a existencia da configuração abaixo no ficheiro /opt/shibboleth-idp/conf/attribute-filter.xml

Ficheiro: /opt/shibboleth-idp/conf/attribute-filter.xml

 <!-- =========================================================  -->
<!--  Envio automatico de um conjunto de atributos para os      -->
<!--  servicos marcados com a categoria Research & Scholarship  -->
<!-- ========================================================   -->
<AttributeFilterPolicy id="releaseRandSAttributeBundle">
        <PolicyRequirementRule xsi:type="AND">
                <Rule xsi:type="EntityAttributeExactMatch"
                attributeName="http://macedir.org/entity-category"
        attributeValue="http://refeds.org/category/research-and-scholarship"/>
                <Rule xsi:type="NOT">
                        <Rule xsi:type="OR">
                                <Rule xsi:type="ValueRegex"  attributeID="eduPersonPrincipalName" regex=".*teste.*"/>
                                <Rule xsi:type="ValueRegex"  attributeID="eduPersonPrincipalName" regex=".*authmonit.*"/>
                        </Rule>
                </Rule>
        </PolicyRequirementRule>
        <!-- a fixed subset of the Research & Scholarship Attribute Bundle -->
        <AttributeRule attributeID="eduPersonPrincipalName">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="eduPersonTargetedID">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="email">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <!-- either displayName or (givenName and sn) is REQUIRED but all three are RECOMMENDED -->
        <AttributeRule attributeID="displayName">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="givenName">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="surname">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <!-- release of ePSA is OPTIONAL -->
        <AttributeRule attributeID="eduPersonScopedAffiliation">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
</AttributeFilterPolicy>

<!-- =========================================================  -->
<!--  Envio automatico de um conjunto de atributos para os      -->
<!--  servicos marcados com a categoria Geant                   -->
<!--  dataprotection-code-of-conduct                            -->
<!-- ========================================================   -->
<AttributeFilterPolicy id="releaseToCoCo">
        <PolicyRequirementRule xsi:type="AND">
                <Rule xsi:type="EntityAttributeExactMatch"
                attributeName="http://macedir.org/entity-category"
                attributeValue="http://www.geant.net/uri/dataprotection-code-of-conduct/v1"/>
                <Rule xsi:type="NOT">
                        <Rule xsi:type="OR">
                                <Rule xsi:type="ValueRegex"  attributeID="eduPersonPrincipalName" regex=".*teste.*"/>
                                <Rule xsi:type="ValueRegex"  attributeID="eduPersonPrincipalName" regex=".*authmonit.*"/>
                        </Rule>
                </Rule>
        </PolicyRequirementRule>
        <AttributeRule attributeID="email">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="eduPersonPrincipalName">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
        <AttributeRule attributeID="eduPersonScopedAffiliation">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
         <AttributeRule attributeID="schacHomeOrganization">
                <PermitValueRule xsi:type="ANY"/>
        </AttributeRule>
          <AttributeRule attributeID="displayName">
                 <PermitValueRule xsi:type="AttributeInMetadata" onlyIfRequired="true" />
        </AttributeRule>
        <AttributeRule attributeID="commonName">
                 <PermitValueRule xsi:type="AttributeInMetadata" onlyIfRequired="true" />
        </AttributeRule>
        <AttributeRule attributeID="eduPersonTargetedID">
                 <PermitValueRule xsi:type="AttributeInMetadata" onlyIfRequired="true" />
        </AttributeRule>
        <AttributeRule attributeID="eduPersonAffiliation">
                 <PermitValueRule xsi:type="AttributeInMetadata" onlyIfRequired="true" />
        </AttributeRule>
</AttributeFilterPolicy>  

Para verificar a conformidade desta configuração podem utilizar o serviço de verificação de atributos https://release-check.edugain.org/

Após confirmada a existencia da configuração referida acima, apenas é necessário adicionar a seguinte configuração no ficheiro /opt/shibboleth-idp/conf/attribute-filter.xml
 <AttributeFilterPolicy id="ESItoSelectedServices">

 <PolicyRequirementRule xsi:type="AND">
        <Rule xsi:type="OR">
           <Rule xsi:type="Requester" value="https://proxy.prod.erasmus.eduteams.org/metadata/backend.xml" />
           <Rule xsi:type="Requester" value="https://authmonit.fccn.pt" />
        </Rule> 

        <Rule xsi:type="Value" attributeID="eduPersonScopedAffiliation" value="student" />

 </PolicyRequirementRule>

 <AttributeRule attributeID="schacPersonalUniqueCode">
        <PermitValueRule xsi:type="ValueRegex" regex="^urn:schac:personalUniqueCode:int:esi:.*$" />
    </AttributeRule>

</AttributeFilterPolicy>
Este filtro garante que o atributo schacPersonalUniqueCode só é enviado:
  • Apenas para o proxy do MyAcademicID; e
  • Se o utilizador for um estudante; e
  • Se o atributo ESI estiver no formato correto

Se já realizaram o pedido à equipa RCTSaai para suportar a categoria "European Student Identifier Entity Category" devem utilizar a seguinte configuração:

Ficheiro: /opt/shibboleth-idp/conf/attribute-filter.xml

<AttributeFilterPolicy id="MyAcacemicID-ESI">
    <PolicyRequirementRule xsi:type="AND">    
        <Rule xsi:type="EntityAttributeExactMatch"
            attributeName="http://macedir.org/entity-category"
            attributeValue="https://myacademicid.org/entity-categories/esi"/>

        <Rule xsi:type="Value" attributeID="eduPersonScopedAffiliation" value="student" />
    </PolicyRequirementRule>

    <AttributeRule attributeID="schacPersonalUniqueCode">
        <PermitValueRule xsi:type="ValueRegex" regex="^urn:schac:personalUniqueCode:int:esi:.*$" />
    </AttributeRule>
</AttributeFilterPolicy>
European Student Identifier Entity Category

Para permitir o envio do atributo ESI de forma escalável em toda a europa foi criada a categoria "European Student Identifier Entity Category". Esta categoria suporta uma estrutura leve que controla o envio escalável e seguro do atributo ESI, governando quem (quais Fornecedores de Serviços) deve ser elegível para solicitar e, consequentemente, receber o ESI de instituições académicas.

Para mais detalhes consulte "European Student Identifier Entity Category"

Após a alteração destes valores deverá reiniciar o Shibboleth com o comando:

service tomcat restart 

Serviço de Teste


Devem realizar testes e verificar que o atributo schacPersonalUniqueCode está definido corretamente através do serviço

Serviços via Proxy MyAcademicID


Após realizados os testes e confirmada a correcta definição do schacPersonalUniqueCode podem aceder aos seguintes serviços:

No login destes serviços serão redireccionados para o "WAYF" do MyAcademicID.

Devem pesquisar pelo nome da vossa instituição para que possam ser redireccionados para o vosso Fornecedor de Identidade.

Perfil Administrador EWP


O perfil de administrador EWP (Erasmus Without Paper Administrator) foi definido para permitir que os representantes autorizados das Instituições do Ensino Superior (IES) que participam em atividades Erasmus+ possam utilizar a autenticação federada em serviços/ferramentas EWP de forma a realizar a gestão da sua informação e configuração EWP.

Para enviar informação de perfil será utilizado o atributo eduPersonEntitlement (urn:oid:1.3.6.1.4.1.5923.1.1.1.7) com o valor urn:geant:erasmuswithoutpaper.eu:ewp:admin

Passos necessários a realizar pela instituição para envio de informação de perfil:

  • 1º Passo - Identificar utilizadores e configurar atributo eduPersonEntitlement

Identificar os responsáveis autorizados que necessitam de ter acesso às ferramentas da rede EWP ( ex.: EWP Registration Portal) e configurar o atributo eduPersonEntitlement de forma a incluir o valor urn:geant:erasmuswithoutpaper.eu:ewp:admin apenas para os utilizadores autorizados.

Exemplo de configuração do atributo eduPersonEntitlement com base no atributo email
Devem substituir os endereços de email (email1@domino.pt e email2@domino.pt) pelos respectivos emails dos vossos representantes autorizados.

Exemplo para IdP's Shibboleth versão superior ou igual a 3.4

Ficheiro: /opt/shibboleth-idp/conf/attribute-resolver-rctsaai-core.xml

<AttributeDefinition id="eduPersonEntitlement" xsi:type="ScriptedAttribute" language="rhino">
        <InputAttributeDefinition ref="email" />

        <DisplayName xml:lang="en">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="de">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="fr">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="it">EduPerson Entitlement</DisplayName>

        <DisplayDescription xml:lang="en">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="de">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="fr">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="it">EduPerson Entitlement</DisplayDescription>

     <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonEntitlement" />
     <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" />

      <Script><![CDATA[

            eduPersonEntitlement.addValue("urn:mace:terena.org:tcs:escience-user");
            eduPersonEntitlement.addValue("urn:mace:terena.org:tcs:personal-user");
            eduPersonEntitlement.addValue("urn:mace:dir:entitlement:common-lib-terms");

            // add EWP admin
            if (email.getValues().get(0) == "email1@domino.pt" || email.getValues().get(0) == "email2@domino.pt" ){
                eduPersonEntitlement.addValue("urn:geant:erasmuswithoutpaper.eu:ewp:admin");
            }
          ]]>
        </Script>

    </AttributeDefinition>

Exemplo para IdP Shibboleth versão inferior ou igual a 3.3

Ficheiro: /opt/shibboleth-idp/conf/attribute-resolver-rctsaai-core.xml

<AttributeDefinition id="eduPersonEntitlement" xsi:type="ScriptedAttribute" >
       <Dependency ref="email" />

        <DisplayName xml:lang="en">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="de">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="fr">EduPerson Entitlement</DisplayName>
        <DisplayName xml:lang="it">EduPerson Entitlement</DisplayName>

        <DisplayDescription xml:lang="en">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="de">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="fr">EduPerson Entitlement</DisplayDescription>
        <DisplayDescription xml:lang="it">EduPerson Entitlement</DisplayDescription>

     <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonEntitlement" />
     <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" />

      <Script><![CDATA[
        // load compatibility script
        load("nashorn:mozilla_compat.js");

            eduPersonEntitlement.addValue("urn:mace:terena.org:tcs:escience-user");
            eduPersonEntitlement.addValue("urn:mace:terena.org:tcs:personal-user");
            eduPersonEntitlement.addValue("urn:mace:dir:entitlement:common-lib-terms");

            // add EWP admin
            if (email.getValues().get(0) == "email1@domino.pt" || email.getValues().get(0) == "email2@domino.pt" ){
                eduPersonEntitlement.addValue("urn:geant:erasmuswithoutpaper.eu:ewp:admin");
            }
          ]]>
        </Script>

    </AttributeDefinition>
  • 2º Passo - Libertar o atributo eduPersonEntitlement

Libertar atributo eduPersonEntitlement (urn:oid:1.3.6.1.4.1.5923.1.1.1.7) para o serviço MyAcademicID apenas para os utilizadores identificados como responsáveis autorizados.

Ficheiro: /opt/shibboleth-idp/conf/attribute-filter.xml

  <AttributeFilterPolicy id="ESItoSelectedServicesAdmin">

        <PolicyRequirementRule xsi:type="OR">

                 <Rule xsi:type="Requester" value="https://proxy.prod.erasmus.eduteams.org/metadata/backend.xml" />
                  <Rule xsi:type="Requester" value="https://authmonit.fccn.pt" />

       </PolicyRequirementRule>

   <AttributeRule attributeID="eduPersonEntitlement">
        <PermitValueRule xsi:type="Value" value="urn:geant:erasmuswithoutpaper.eu:ewp:admin" ignoreCase="true"/>
    </AttributeRule>

 </AttributeFilterPolicy>

Para verificar/testar o envio deste atributo podem utilizar o serviço de teste https://myacademicid.devtest.eduteams.org através da opção "Test Attribute Release for EWP Admins".