Аутентификация пользователя в DeviantArt - PullRequest
3 голосов
/ 05 мая 2019

Я пытаюсь создать приложение, которое может помочь мне публиковать произведения искусства на разных платформах одновременно и в определенное время.

Итак, что я пытаюсь сделать, это просто получить код аутентификации от DeviantArt, используя Предоставление кода аутентификации из их API в PHP, затем я возьму этот код и включу егомое приложение, чтобы я мог использовать его для получения токена доступа и публикации рисунков в своей учетной записи.

Я сделал приведенный ниже код PHP, чтобы выполнить запрос GET на https://www.deviantart.com/oauth2/authorize, и он успешно отправил мне сообщение.на страницу аутентификации.Но когда я захожу в свою учетную запись, выдается ошибка 403 Forbidden Access.API требует, чтобы я опубликовал свое приложение и белый список URI перенаправления OAtuth2, и я уже сделал это.

Вот код в poster / assets / php / authDeviantArt.inc.php :

<?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;
} ?>

И вот файл в URI, который DeviantArt должен перенаправить мне ( poster / requestAuthorization.php ):

<?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>

UPDATE 01: Я удалил порт из URI как в белом списке, так и в redirect_uri, и он по-прежнему выдает ошибку 403, когда я вхожу в систему. Я также обнаружил, что если я передам свойство redirect_uriURI, который не внесен в белый список, будет отображать страницу с ошибкой вместо того, чтобы просить меня войти в систему. Я также попытался попросить его перенаправить меня на другую веб-страницу (youtube), но безуспешно (все еще выдает ошибку 403).

ОБНОВЛЕНИЕ 02: Один из ответов предположил, что ошибка может быть в том, что мне нужно отправить запрос с «АГЕНТ-ПОЛЬЗОВАТЕЛЕМ» в заголовке и сжать его.Теперь мой код выглядит так:

<?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;
}
?>

Приведенный выше код по-прежнему не решает проблему, возможно, потому, что мне нужно «сжать» мой HTTP-запрос GET?Я совсем новичок, и я пытался провести какое-то исследование, но я не мог найти, как это сделать.

ОБНОВЛЕНИЕ 03: Благодаря одному из ответов ниже, яузнал, как сжать мой запрос.К сожалению, это не сработало.Я отправлю электронное письмо в службу поддержки DeviantArt и посмотрю, смогут ли они мне помочь.Мой код сейчас такой:

<?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;
    }
?>

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Я не могу сказать, делаете ли вы это, но вы можете получить 403, если вы не отправляете User Agent и не используете сжатие в своих запросах. IIRC в какой-то момент в прошлом они молча начали приводить в исполнение оба из них без предварительного уведомления. Было весело, когда все внезапно провалилось.

Цитировать Раздел ошибок DA

Если вы получаете 403 ошибки, которые содержат ответ HTML, а не JSON, убедитесь, что ваш клиент отправляет заголовок User Agent и использует HTTP-сжатие для запроса, мы отклоняем любые запросы, не отвечающие этому требованию.

1 голос
/ 08 мая 2019

Я выяснил в чем проблема.Очевидно, я не должен получать содержимое страницы аутентификации и отражаться на моей странице.Вместо этого я должен перенаправить пользователя на страницу аутентификации.

<?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");
    }
?> 
1 голос
/ 05 мая 2019

Возможно, вы захотите прочитать эту ссылку и не / успешные примеры которых.

Мне кажется, что эти переменные обязательны:

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

Успешный пример

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

Исходя из примера, может быть, вы просто упускаете client_secret переменная, и, если хотите, вы можете добавить grant_type.

<?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;
} ?>

Однако, их сообщение об ошибке, похоже, не требует этих переменных:

{"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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...