Impossible de mettre à jour l'email via l'API : erreur 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.

Je rencontre également ce problème et je me demande si cela est lié à l’utilisation d’un fournisseur OAuth pour la connexion, ce qui pourrait bloquer cette page spécifique ?

Il est peu probable que ce soit le fournisseur OAuth, car les clés d’API le contournent.

Pourriez-vous partager le code de votre requête API ?

En 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)

Édition : Un code très similaire pour définir des groupes sur des utilisateurs, etc., a fonctionné, donc la combinaison clé/nom d’utilisateur (qui correspond à un utilisateur disposant de privilèges d’administration) fonctionne.

Édition 2 : D’après d’autres discussions sur le forum, je suppose que cela doit être fait directement dans la base de données (ou plutôt via la console), ce qui est impossible pour nous.

D’autres réflexions à ce sujet ? J’ai le sentiment que quelqu’un disposant de droits d’administration devrait pouvoir définir l’adresse e-mail d’une personne.

Comment ça ? Je ne pense pas que ce soit possible avec l’interface web existante, qui définit l’API. Par conséquent, cela ne peut pas être fait.

Vous voulez dire que l’UX/API devrait permettre de définir l’adresse e-mail d’un utilisateur à n’importe quelle valeur. (Ce n’est pas que vous croyez que cela soit actuellement possible.)

Vous pouvez initier un changement (via l’UX et, je suppose, l’API) en modifiant son profil et en saisissant la nouvelle adresse, mais elle ne sera pas modifiée tant qu’il n’aura pas cliqué sur le lien dans son e-mail. Est-ce suffisant ? Sinon, vous devrez le faire depuis la console ou via un plugin.

Exactement.

Chaque fois que je saisis quelque chose dans l’UX pour modifier l’e-mail (auquel je n’ai accès que via l’URL directe, soit https://<discourse>/u/<username>/preferences/email, sans lien depuis le profil de l’utilisateur), un message apparaît indiquant que je ne peux pas le faire après avoir cliqué sur « Modifier » :

Et cela concerne mon propre compte en tant qu’administrateur. Je ne reçois pas d’e-mail.

Je suis arrivé à ce point aussi…

@pfaffman : vous avez indiqué qu’il est possible de modifier l’adresse e-mail dans le profil, mais cela nécessite que email editable soit activé, n’est-ce pas ?

J’ai appris qu’il n’existe aucun moyen pour un administrateur ou un appel d’API administratif d’initier une modification de l’adresse e-mail, sauf si les utilisateurs sont également autorisés à modifier leurs propres adresses e-mail, n’est-ce pas ? Je peux tout à fait accepter qu’un e-mail de confirmation soit envoyé et que la modification doive être autorisée par l’utilisateur.

Mon cas d’usage est que les utilisateurs seront gérés dans une autre application via l’API. Je ne veux donc pas qu’ils modifient eux-mêmes leurs adresses e-mail, uniquement dans Discourse.

Pourriez-vous implémenter l’authentification unique (SSO) et faire de votre autre application la source des connexions ?

Il existe un paramètre SSO spécifique sso overrides email qui fait exactement ce que vous essayez d’accomplir. Si vous avez configuré le SSO, vous pouvez ensuite utiliser le point de terminaison sync_sso et y passer la nouvelle adresse e-mail.

Merci @blake, c’est un défi mais ça a son charme :wink:

Je devrais importer les mots de passe de Discourse vers le hub d’identité… oh là là.

J’ai adapté mon scénario initial avec une procédure en trois étapes : activer l’édition de l’e-mail, initier le changement d’adresse e-mail, désactiver l’édition de l’e-mail. Cela semble un peu excessif, mais ça fonctionne.

Je vais réfléchir au scénario SSO.