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