ORCiD-Workshop: Die ORCiD-API

7 September 2017

Torsten Bronger

Zentralbibliothek, Forschungszentrum Jülich

Die ORCiD-API

2

Voraussetzungen

Man benötigt stets eine Client-ID und ein Client-Secret. Bekommt man von
ORCID.

Unsere Konfiguration:

ORCID_CLIENT_ID = APP-****************
ORCID_CLIENT_SECRET = ********-****-****-****-************
SECRET_KEY = **************************************************
ORGANIZATION_NAME_REGEX = (Forschungszentrum|research center|research centre)\\s+j(ü|u|ue)lich
ORCID_AFFILIATION = {\"name\": \"Forschungszentrum Jülich\", \
                     \"address\": {\"city\": \"Jülich\", \
                                 \"region\": \"Nordrhein-Westfalen\", \
                                 \"country\": \"DE\"}, \
                     \"disambiguated-organization\": \
                     {\"disambiguated-organization-identifier\": \"28334\", \
                      \"disambiguation-source\": \"RINGGOLD\"}}
3

OAuth 2

4

Anmerkungen zur Implementierung

„State“ ist bei uns das Tupel (Nutzer-ID, Nutzer-ID || SECRET, Redirect-URL).

Das Access-Token muß sicher gespeichert werden. Verschlüsselt, aber nicht als
Hash. Bei uns: Mehrfach genutztes One-Time-Pad (räusper).

Nach erfolgreichem OAuth 2 findet Authorisierung bei jedem HTTPS-Request wie
folgt statt:

Authorization type: Bearer
Access token: <Access-Token für diesen Nutzer>

Wenn es nicht um das Profil einen bestimmten Nutzers geht: Client credientials
(client_id und client_secret) werden bei POST/PUT im Body übergeben, sonst
nur client_id im Query String.

5

Webserver

/orcid /orcid/submit
Bei „Code“:
  1. ORCiD und Access-Token speichern
  2. Redirect auf /orcid
  1. Publikationsliste anzeigen
  2. Benutzer Publikationen auswählen lassen
  3. Hochladen zu ORCiD
  4. Redirect auf /orcid
ORCiD vorhanden: Hochladen anbieten
Sonst: Anbieten, sich mit ORCiD zu verbinden
6

Demo

#!/usr/bin/python3

import requests, subprocess, json

response = requests.post(
    "https://orcid.org/oauth/token",
    data={"client_id": open("id").read(),
          "client_secret": open("secret").read(),
          "grant_type": "authorization_code",
          "code": subprocess.check_output(["ssh_zb", "cat", "/tmp/bronger_code"]).decode(),
          "redirect_uri": "https://juser.fz-juelich.de/orcid"
    })

result = json.loads(response.text)
print("\nORCiD: {}\nAccess-Token: {}".format(result.get("orcid"), result.get("access_token")))
7

Wichtige Endpunkte

Dabei im HTTP-Header:

Accept: application/orcid+json
Content-Type: application/orcid+json

… oder halt XML, wenn einem das lieber ist.

8

Wichtige Endpunkte II

9

Struktur einer Affiliation

{"name": "Forschungszentrum Jülich",
 "address": {"city": "Jülich",
             "region": "Nordrhein-Westfalen",
             "country": "DE"},
 "disambiguated-organization":
 {"disambiguated-organization-identifier": "28334",
  "disambiguation-source": "RINGGOLD"}}

Das ist dann die Nutzlast des POST-Requests.

Die Ringgold-Nummer nutzen wir (neben einer Regex auf den Namen), um zu
detektieren, ob die Affiliation schon im Profil hinterlegt ist. (ORCiD-IDs für
Affiliations wären hier natürlich praktisch, sind aber erst in Planung seitens
ORCiD.)

10

Put-Codes

Put-Codes sind die nicht-geheime interne ID von Objekten in der
ORCiD-Datenbank.

Zwei Möglichkeiten, an die Put-Codes zu kommen:

1. Alle Veröffentlichungen eines Nutzers holen.
2. source-client-id.uri muß mit der eigenen URI übereinstimmen.
3. SOURCE_WORK_ID enthält dann die eigene interne ID der Veröffentlichung.
4. Der Put-Code steht im Feld „put-code“.

11

Python-API

Beispiel:

import orcid
api = orcid.MemberAPI(ORCID_CLIENT_ID, ORCID_CLIENT_SECRET, sandbox=False)
publications = api.read_record_member(orcid_id, "activities", token)["works"]
12

Original-Dokumentation der ORCiD-API

13

Fehler, die man abfangen sollte

14

Thank you

Torsten Bronger

Zentralbibliothek, Forschungszentrum Jülich

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)