E-Mail kann über API nicht aktualisiert werden – Fehler invalid_access

Hi Guys,

Im getting an error when trying to use the API to update email.
I have looked at the logs and can see the following:

Started PUT “/discussion/users/davetest/preferences/email.json” for xx.xx.xx.xx at 2018-05-11 12:22:11 +0000

Processing by UsersEmailController#update as JSON

Parameters: {“api_key”=>;"[FILTERED]", “api_username”=>;“daveAdmin”, “email”=>;“[new.email@example.com](mailto:new.email@example.com)”, “username”=>;“davetest”}

Can’t verify CSRF token authenticity.

This is a PUT request, but looking at the scopes below, doesnt seem like PUT is supported for the WRITE scope? surely im misunderstanding, so could someone please assist?

I have re-generated the all-user api-key, also created specific user api-keys to use, but same result.

SCOPES = {
read: [:get],
write: [:get, :post, :patch],
message_bus: [[:post, ‘message_bus’]],
push: nil,
notifications: [[:post, ‘message_bus’], [:get, ‘notifications#index’], [:put, ‘notifications#mark_read’]],
session_info: [[:get, ‘session#current’], [:get, ‘users#topic_tracking_state’]]
}

Can you verify the content-type that you are making the API request as? It needs to be

"Content-Type: multipart/form-data;"

If it is not that content type you may see the CSRF token error.

Hi, thanks for the reply.
I actually had tried it both with ‘application/json’ and ‘application/x-www-form-urlencoded’ and neither worked. I have now tried it with what you suggested (via postman) and getting:

“You are not permitted to view the requested resource. The API username or key is invalid.”

I have regenerated the global api key that is used for “all users” and using it with my own username, which is an admin too…

shahid

Here is an example of my postman request maybe you can spot any differences with what you are doing? I’m also using the “all users” key with an admin username.

yes, its the same, im using the Postman API collection supplied by discourse. So using it as suggested. I will try again tonight and see if i get any different results. Will update when ive tried. Thanks for assisting, much appreciated. Do let me know if you have any other idea.

Ich habe das gleiche Problem und frage mich, ob es damit zu tun hat, dass ein OAuth-Anbieter für die Anmeldung verwendet wird und daher diese spezifische Seite blockiert wird?

Es liegt höchstwahrscheinlich nicht am OAuth-Anbieter, da die API-Schlüssel diesen umgehen.

Könntest du den Code für deine API-Anfrage teilen?

in Python:

import json
import requests
import time

my_token = ''

url_base = '<>'
update_email = url_base + "users/<my_username>/preferences/email.json"

headers = {
    "Content-Type": "multipart/form-data",
    'user-agent': 'my-app/0.0.1',
    'Api-Key': my_token,
    'Api-Username': '<my_username>'
}

data = {
  "email": "<new_email>"
}

response = requests.put(update_email, data=data, headers=headers)

print(response.text)

Edit: Sehr ähnlicher Code zum Setzen von Gruppen für Benutzer usw. hat funktioniert, sodass die Kombination aus Schlüssel und Benutzername (ein Benutzer mit Administratorrechten) funktioniert.

Edit 2: Ich vermute aufgrund anderer Beiträge im Forum, dass dies direkt in der Datenbank (oder genauer gesagt über die Konsole) erfolgen muss, was für uns unmöglich ist.

Noch weitere Gedanken dazu? Ich bin der Meinung, dass jemand mit Admin-Rechten die E-Mail-Adresse einer Person festlegen können sollte.

Wie so? Ich denke nicht, dass dies mit der bestehenden Web-Oberfläche möglich ist, die die API definiert. Daher kann es nicht umgesetzt werden.

Du meinst, dass die UX/API es ermöglichen sollte, die E-Mail-Adresse eines Benutzers auf einen beliebigen Wert zu setzen. (Nicht, dass du glaubst, dass dies aktuell möglich ist.)

Du kannst eine Änderung einleiten (über die UX und, wie ich annehme, auch über die API), indem du ihr Profil bearbeitest und die neue Adresse eingibst. Sie wird jedoch erst geändert, wenn sie auf den Link in ihrer E-Mail klickt. Ist das ausreichend? Falls nicht, musst du dies über die Konsole oder ein Plugin durchführen.

Genau.

Immer wenn ich in der UX etwas zur Bearbeitung der E-Mail-Adresse eingebe (auf die ich nur über die direkte URL zugreifen kann, also https://<discourse>/u/<username>/preferences/email; es gibt keinen Link über das Benutzerprofil), erscheint nach dem Klicken auf „Ändern“ folgende Meldung:

Und das betrifft sogar mein eigenes Konto als Administrator. Ich erhalte keine E-Mail.

Bin auch jetzt an diesem Punkt angelangt…

@pfaffman: Du hast gesagt, dass es möglich ist, die E-Mail-Adresse im Profil zu ändern, aber dafür muss email editable gesetzt sein, oder?

Ich habe erfahren, dass es für einen Administrator oder eine administrative API-Aufruf keine Möglichkeit gibt, eine Änderung der E-Mail-Adresse einzuleiten, es sei denn, die Benutzer dürfen ihre E-Mail-Adressen ebenfalls ändern, oder? Ich kann definitiv damit leben, dass eine Bestätigungs-E-Mail gesendet wird und die Änderung vom Benutzer autorisiert werden muss.

Mein Anwendungsfall ist, dass die Benutzer über eine andere App verwaltet werden, die die API nutzt. Daher möchte ich nicht, dass sie ihre E-Mail-Adressen nur in Discourse selbst ändern.

Könntest du Single Sign-On implementieren und deine andere App zur Quelle für Anmeldungen machen?

Es gibt eine spezielle SSO-Einstellung sso overrides email, die genau das bewirkt, was du erreichen möchtest. Wenn du SSO eingerichtet hast, kannst du dann den sync_sso-Endpunkt verwenden und die neue E-Mail-Adresse übergeben.

Danke @blake, das ist herausfordernd, aber auch reizvoll :wink:

Ich müsste die Passwörter von Discourse in den Identity Hub importieren … oh je.

Ich habe mein ursprüngliches Szenario mit einem Drei-Schritte-Verfahren gelöst: E-Mail-Bearbeitung aktivieren, Änderung der E-Mail-Adresse einleiten, E-Mail-Bearbeitung deaktivieren. Das wirkt vielleicht etwas übertrieben, funktioniert aber.

Ich werde mir das SSO-Szenario noch genauer ansehen.