Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > OAuth вконтакте, авторизация разработка приложения


Автор: magesi 31.5.2012, 05:33
Привет всем!

Хотел написать свой мессенджер для контакта, чтобы не заходить на сайт, да и не хочется использовать готовые IM , чисто для себя и для практики хотелось.

Столкнулся с проблемой в сборке HTTP запроса в своем приложении, приведу код ( он тестовый , просто проверял ответ от сервера ):

Код

#include <iostream>
#include <WinSock2.h>

#pragma comment(lib, "Ws2_32.lib")

void PrintResponse(char mess[], int size)
{
    for(int i = 0; i < size; i++)
    {
        std::cout << mess[i];
    }

    std::cout;
}

int main(void)
{
    WSAData data;
    SOCKET sock;
    SOCKADDR_IN addr;

    char *ip = "93.186.231.220";
    u_short port = 0x50;
    int result;
    char buffer[0x400];
    char *mess = "POST /authorize HTTP/1.1\r\nHost: oauth.vk.com\r\nConnection: close\r\nCache-Control: no-cache\r\nContent-type: text/html\r\n\r\nclient_id=2976878&scope=photos&redirect_uri=http://oauth.vk.com/blank.html&display=DISPLAY&response_type=token";

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(ip);
    addr.sin_port = htons(port);

    result = WSAStartup(0x202, &data);

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    result = connect(sock, (sockaddr*)&addr, sizeof(addr));
    result = send(sock, mess, strlen(mess), 0);
    result = recv(sock, buffer, sizeof(buffer), 0);

    PrintResponse(buffer, result);

    return 0;
}


Как видно, я отправляю такой HTTP-request:
Код

POST /authorize HTTP/1.1\r\n
Host: oauth.vk.com\r\n
Connection: close\r\nCache-Control: no-cache\r\n
Content-type: text/html\r\n
\r\n
client_id=2976878&scope=photos&redirect_uri=http://oauth.vk.com/blank.html&display=DISPLAY&response_type=token


Ответ , который мне приходит от сервера вконтакте такой:
Код

HTTP/1.1 401 Unauthorized
Server: nginx/1.0.11
Date: Thu, 31 May 2012 02:28:48 GMT
Content-Type: application/json
Connection: close
X-Powered-By: PHP/5.3.3-7+squeeze3
Set-Cookie: remixlang=0; expires=Wed, 29-May-2013 20:58:32 GMT; path=/; domain=.
vk.com
Pragma: no-cache
Cache-control: no-store
Set-Cookie: remixchk=5; expires=Sun, 02-Jun-2013 12:46:32 GMT; path=/; domain=.v
k.com
Content-Length: 71

{"error":"invalid_client","error_description":"client_id is incorrect"}


Что-то не врублюсь. AppId перепроверил - верное, др. параметры тоже, сам HTTP-запрос , который я сформировал - тоже верный, если бы кривый был бы 401 ошибка не вернулась бы...

Нужно получить HTML-ответ от контакта в виде:
user posted image

Там , я уже по какому-нибудь алгоритму подстроки в строке разберу, что если я получаю такой ответ, то ОК! и сформирую новый запрос уже с логином/паролем.

Но, почему я получаю 401 ранее? Я перепроверил, все, как в инструкции:
http://vk.com/developers.php?id=-1_37230422&s=1

HTTP-запрос тоже верный, ибо 401 означает Unauthorized, если бы кривый был бы запрос, то получил бы Bad Request 400.

В чем проблема и как ее решить?

Автор: borisbn 31.5.2012, 08:30
Не совсем в тему (возможно, даже совсем не в тему)...
А почему ты выбрал Си++ для web-приложения ?
Судя по скриншоту у тебя яблочная ОС, и предложить тебе оптимальный язык я не смогу (не знаю), однако могу сказать точно, что Си++ для этой цели - далеко не самое лучшее (возможно - худшее) средство. Посмотри на питон, например (насколько я знаю он есть для макОСи)

Автор: feodorv 31.5.2012, 12:01
Цитата(magesi @  31.5.2012,  06:33 Найти цитируемый пост)
сам HTTP-запрос , который я сформировал - тоже верный

Для POSt-запроса нужно указывать его длину.

Цитата(magesi @  31.5.2012,  06:33 Найти цитируемый пост)
Content-type: text/html\r\n

Это лишнее. Нужен как раз Content-length.

Автор: Amp 31.5.2012, 12:40
Цитата(borisbn @  31.5.2012,  08:30 Найти цитируемый пост)
Судя по скриншоту у тебя яблочная ОС

Этот скриншот из вконтактовой документации smile

Добавлено через 11 минут и 33 секунды
С C++ и голыми сокетами будет весело. После посылки запроса должно будет произойти перенапраление на redirect_uri - этот момент нужно будет отловить. Еще, вроде как, нужна поддержка cookies. Потом надо будет разобрать пришедший html - понадобится парсер, придется копаться в каких-нибудь полуживых проектах на sf или googlecode.

На моей памяти одна опенсорсная софтина поступала с OAuth просто и незамыслвоато - открывала URL для запроса токена в небольшом окошке с webkit-ом и просила (!) пользователя скопировать то ли весь URL, то ли только токен в специально поле.

Автор: boostcoder 31.5.2012, 13:01
Цитата(magesi @  31.5.2012,  05:33 Найти цитируемый пост)
char *mes

знакомый ник smile

Автор: magesi 31.5.2012, 17:04
Цитата(borisbn @  31.5.2012,  08:30 Найти цитируемый пост)
А почему ты выбрал Си++ для web-приложения ?

C чего Вы решили, что это будет именно браузерное приложение?

А что десктопные приложения не должны теперь работать?

Сейчас есть много игр 3D , которые сразу работает с контактом, одноклассниками и прочее... Чтобы делиться результатами.

IM типа QIP, которые дают возможность общаться вне браузера и прочее...

Вот , для таких целей и выбирают. А там может быть хоть: Си, паскаль, лисп и что сам пожелаешь...
Это другой вопрос уже...


Цитата(borisbn @  31.5.2012,  08:30 Найти цитируемый пост)
сказать точно, что Си++ для этой цели - далеко не самое лучшее (возможно - худшее) средство. Посмотри на питон, 

Вы не знаете финальной цели, а уже говорите заранее , так нельзя.

Добавлено через 2 минуты и 10 секунд
Цитата(borisbn @  31.5.2012,  08:30 Найти цитируемый пост)
Судя по скриншоту у тебя яблочная ОС

ога WinSock на Яблоке smile)) ( см. код )

Автор: borisbn 31.5.2012, 17:16
Цитата(magesi @  31.5.2012,  17:04 Найти цитируемый пост)
Вы не знаете финальной цели, а уже говорите заранее

Цитата(magesi @  31.5.2012,  05:33 Найти цитируемый пост)
Хотел написать свой мессенджер для контакта


Цитата(magesi @  31.5.2012,  17:04 Найти цитируемый пост)
ога WinSock на Яблоке

http://www.witch.westfalen.de/Wine-HOWTO/ch-winsock.html ? Хотя это - извращение.

Если уж очень хочется Си++, то посмотри в сторону 
http://qt-project.org/doc/qt-4.8/qauthenticator.html
http://qt-project.org/doc/qt-4.8/qnetworkrequest.html
http://qt-project.org/doc/qt-4.8/qnetworkreply.html
в частности и http://qt-project.org/doc/qt-4.8/modules.html в общем

Автор: magesi 31.5.2012, 17:19
Цитата(borisbn @ 31.5.2012,  17:16)
Цитата(magesi @  31.5.2012,  17:04 Найти цитируемый пост)
Вы не знаете финальной цели, а уже говорите заранее

Цитата(magesi @  31.5.2012,  05:33 Найти цитируемый пост)
Хотел написать свой мессенджер для контакта


Цитата(magesi @  31.5.2012,  17:04 Найти цитируемый пост)
ога WinSock на Яблоке

http://www.witch.westfalen.de/Wine-HOWTO/ch-winsock.html ? Хотя это - извращение.

Если уж очень хочется Си++, то посмотри в сторону 
http://qt-project.org/doc/qt-4.8/qauthenticator.html
http://qt-project.org/doc/qt-4.8/qnetworkrequest.html
http://qt-project.org/doc/qt-4.8/qnetworkreply.html
в частности и http://qt-project.org/doc/qt-4.8/modules.html в общем

Я вообще-то с WinAPI без Qt/GTK и прочего собираюсь smile

Добавлено @ 17:23
Цитата(Amp @  31.5.2012,  12:40 Найти цитируемый пост)
понадобится парсер, придется копаться в каких-нибудь полуживых проектах на sf или googlecode.

в руки алгоритмы поиска подстроки в строке, типа КМП и БХ и самим писать класс парсера ( уже делал так при работе с pop3/imap для старого проекта )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)