ORCiD-Workshop: Die ORCiD-API
7 September 2017
Torsten Bronger
Zentralbibliothek, Forschungszentrum Jülich
Mitglied der Helmholtz-Gemeinschaft
Torsten Bronger
Zentralbibliothek, Forschungszentrum Jülich
Mitglied der Helmholtz-Gemeinschaft
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\"}}Mitglied der Helmholtz-Gemeinschaft
Mitglied der Helmholtz-Gemeinschaft
„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.
Mitglied der Helmholtz-Gemeinschaft
/orcid |
/orcid/submit |
|---|---|
Bei „Code“:
|
|
| ORCiD vorhanden: Hochladen anbieten | |
| Sonst: Anbieten, sich mit ORCiD zu verbinden |
Mitglied der Helmholtz-Gemeinschaft
#!/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")))Mitglied der Helmholtz-Gemeinschaft
Dabei im HTTP-Header:
Accept: application/orcid+json Content-Type: application/orcid+json
… oder halt XML, wenn einem das lieber ist.
Mitglied der Helmholtz-Gemeinschaft
Mitglied der Helmholtz-Gemeinschaft
{"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.)
Mitglied der Helmholtz-Gemeinschaft
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“.
Mitglied der Helmholtz-Gemeinschaft
Beispiel:
import orcid api = orcid.MemberAPI(ORCID_CLIENT_ID, ORCID_CLIENT_SECRET, sandbox=False) publications = api.read_record_member(orcid_id, "activities", token)["works"]
Mitglied der Helmholtz-Gemeinschaft
Mitglied der Helmholtz-Gemeinschaft
Mitglied der Helmholtz-Gemeinschaft
Mitglied der Helmholtz-Gemeinschaft