3
votes

Authentification des utilisateurs dans DeviantArt

J'essaie de créer une application qui puisse m'aider à publier des images sur différentes plates-formes à la fois de manière chronométrée.

Donc, ce que j'essaie de faire, c'est simplement obtenir le code d'authentification de DeviantArt en utilisant le code d'authentification accordé sur leur API en PHP, puis je prendrai ce code et le placerai sur mon application afin que je puisse l'utiliser pour obtenir le jeton d'accès et publier une illustration sur mon compte.

J'ai a fait le code PHP ci-dessous pour faire une requête GET à https://www.deviantart.com/oauth2/authorize et il m'a envoyé avec succès sur la page d'authentification. Mais lorsque je me connecte à mon compte, cela me donne une erreur 403 Forbidden Access. L'API m'oblige à publier mon application et à mettre en liste blanche l'URI de redirection OAtuth2, et Je l'ai déjà fait.

Voici le code dans poster/assets/php/authDeviantArt.inc.php:

<?php
    if(isset($_POST["submit"])){
        $opts = array(
            'http' => array(
                'method'=>"GET",
                'header'=>"User-Agent: ".$_SERVER["HTTP_USER_AGENT"]."\r\n".
                        "Accept-Encoding: gzip\r\n"
            )
        );

        $context = stream_context_create($opts);
        $result = file_get_contents("compress.zlib://https://www.deviantart.com/oauth2/authorize?response_type=code&client_id=9685&redirect_uri=http://myipaddress/poster/requestAuthorization.php", false, $context);
        echo $result;
    }
?>

Et voici le fichier dans l'URI que DeviantArt devrait me rediriger ( poster / requestAuthorization.php ):

<?php
if(isset($_POST["submit"])){
    $opts = array(
        'http' => array(
            'method'=>"GET",
            'header'=>"User-agent: ".$_SERVER["HTTP_USER_AGENT"]
        )
    );

    $context = stream_context_create($opts);
    $result = file_get_contents("https://www.deviantart.com/oauth2/authorize?response_type=code&client_id=9685&redirect_uri=http://myipaddress/poster/requestAuthorization.php", false, $context);
    echo $result;
}
?>

UPDATE 01: J'ai supprimé le port de l'URI dans la liste blanche et le redirect_uri, et il me donne toujours l'erreur 403 lorsque je me connecte. J'ai également découvert que si je donne à la propriété redirect_uri un URI qui n'est pas sur la liste blanche, une page d'erreur s'affiche au lieu de me demander de me connecter. essayé de lui demander de me rediriger vers une autre page Web (youtube), sans succès (me donnant toujours l'erreur 403).

MISE À JOUR 02: L'une des réponses a suggéré que l'erreur peut être parce que j'ai besoin d'envoyer une demande avec un "USER-AGENT" dans l'en-tête et de la compresser. Maintenant, mon code est comme ceci:

<?php
if(isset($_GET["code"])){
    echo $_GET["code"];
}
?>



<html>
    <head>
        <title>Authorization</title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="assets/php/authDeviantArt.inc.php" method="POST">
            <button type="submit" name="submit">Authorization DeviantArt</button>
        </form>
    </body>
</html>

Le code ci-dessus ne résout toujours pas le problème, probablement parce que j'ai besoin de "compresser" ma requête HTTP GET? Je suis assez nouveau et j'ai essayé de faire des recherches, mais je n'ai pas trouvé comment le faire.

MISE À JOUR 03: Merci à l'une des réponses ci-dessous , J'ai découvert comment compresser ma demande. Malheureusement, cela n'a pas fonctionné. J'enverrai l'e-mail à l'équipe d'assistance de DeviantArt et verrai s'ils peuvent m'aider. Mon code est comme ceci pour le moment:

<?php
if(isset($_POST["submit"])){
    $result = file_get_contents("https://www.deviantart.com/oauth2/authorize?response_type=code&client_id=9685&redirect_uri=http://myipaddress:80/poster/requestAuthorization.php", false);
    echo $result;
} ?>


0 commentaires

3 Réponses :


1
votes

Vous voudrez peut-être lire ce lien et des exemples non réussis.

Il me semble que ces variables sont obligatoires:

{"error":"invalid_request","error_description":"Request field validation failed.","error_details":{"response_type":"response_type is required","client_id":"client_id is required","redirect_uri":"redirect_uri is required"},"status":"error"}

Exemple réussi

<?php
if(isset($_POST["submit"])){
    $result = file_get_contents("https://www.deviantart.com/oauth2/authorize?response_type=code&client_id=9685&redirect_uri=http://myipaddress:80/poster/requestAuthorization.php", false);
    echo $result;
} ?>

Basé sur l'exemple , il vous manque peut-être simplement la variable client_secret , et si vous le souhaitez, vous pouvez ajouter un grant_type .

{
  "expires_in": 3600,
  "status": "success",
  "access_token": "Alph4num3r1ct0k3nv4lu3",
  "token_type": "Bearer"
  "refresh_token": "3ul4vn3k0tc1r3mun4hplA",
  "scope": "basic"
}

Cependant , leur message d'erreur ne semble pas vouloir ces variables:

curl https://www.deviantart.com/oauth2/token \
-d grant_type=authorization_code \
-d client_id=0 \
-d client_secret=mysecret \
-d redirect_uri=http://myapp.example/cb \
-d code=1234


2 commentaires

Merci d'avoir répondu. Le premier code que vous m'avez montré est de demander un jeton d'accès que je peux utiliser pour publier des éléments sur DeviantArt. Pour obtenir le jeton d'accès, j'ai besoin du code d'authentification (vous pouvez voir que l'une des variables est "code"). Pour obtenir le code, je dois d'abord effectuer l'étape d'autorisation de l'utilisateur à partir du lien que vous avez publié. Quand je fais le GET, il m'envoie sur la page pour me connecter à mon compte et quand je fais cela, il me donne un 403, au lieu de me rediriger le requestAuthorization.php avec le code dont j'ai besoin. C'est le problème


J'ai supprimé le port et il me donne toujours l'erreur 403 lorsque je me connecte. J'ai également découvert que si je donne à la propriété redirect_uri un URI qui n'est pas sur la liste blanche, il affichera une page d'erreur au lieu de me demander de me connecter. Donc Je conclus que l'erreur n'est pas due à la liste blanche.



1
votes

Je ne peux pas dire si vous le faites mais vous pourriez obtenir un 403 si vous n'envoyez pas d'agent utilisateur et si vous n'utilisez pas la compression dans vos requêtes. L'IIRC, à un moment donné dans le passé, a silencieusement commencé à appliquer ces deux principes sans préavis. C'était amusant d'avoir tout échoué soudainement.

Pour citer la section Erreurs DA

Si vous recevez 403 erreurs contenant une réponse HTML plutôt que JSON, veuillez vous assurer que votre client envoie un en-tête d'agent utilisateur et utilise la compression HTTP pour la demande, nous rejetons toute demande ne répondant pas à cette exigence.


3 commentaires

Merci d'avoir répondu. Vérifiez la mise à jour 02 dans la question.


Vous pouvez activer la compression en définissant le champ d'en-tête "Accept-Encoding" comme "gzip". Peut-être que cette question et ses réponses pourraient aider stackoverflow.com/questions/8581924/…


Hey. J'ai découvert le problème. Cela n'avait aucun rapport avec le lien, mais je sais maintenant comment faire une requête GET compressée quand j'en ai besoin. Merci pour l'aide!



1
votes

J'ai découvert quel était le problème. Apparemment, je ne devrais pas obtenir le contenu de la page d'authentification et faire écho dans ma page. Au lieu de cela, je devrais rediriger l'utilisateur vers la page d'authentification.

<?php
    if(isset($_POST["submit"])){
        header("Location: https://www.deviantart.com/oauth2/authorize?response_type=code&client_id=9685&redirect_uri=http://myipaddress/poster/requestAuthorization.php");
    }
?> 


0 commentaires