2015-03-15 2 views
0

в документе Google «Использование OAuth 2.0 для устройств» .it упоминает, что мы должны отправить следующую информацию на accounts.google.com после регистрации приложения в консоли.как реализовать Oauth2.0 gmail с использованием языка программирования c

POST /o/oauth2/device/code HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com& scope=email%20profile 
i implement that in c with the follwing steps: 

1: объявить глобальный массив:

static char gmail_request_token_url[] = "POST /o/oauth2/device/code HTTP/1.1\r\n" 
             "Host: accounts.google.com\r\n" 
             "Content-Type: application/x-www-form-urlencoded\r\n" 
             "Content-Length: 289\r\n" 
             "Accept: text/html,*/*\r\n" 
             "User-Agent: Mozilla/5.0\r\n" 
             "client_id=my.apps.googleusercontent.com&scope=email%20profile\r\n"; 

2: создать сокет Подключение к "accounts.google.com" порт (80 или 443) и использовать отправить:

if(send(socket_fd, gmail_get_tokens, sizeof(gmail_get_tokens),0) > 0) 
{ 
    printf("successfully send content to google"); 
} 

3: использовать цикл в то время как ответ Recv от сервера

while(1) 
{ 
    ret = recv(......); 


} 

, к сожалению, возвращаемое значение recv всегда 0. означает, что оно ничего не получает. Я не знаю, что с ним не так. Помогите мне.

+0

Вам необходимо использовать HTTPS. – SLaks

+0

Извините, что вы имеете в виду, используя https.how, чтобы реализовать это в коде? я спешу, пожалуйста, помогите. спасибо –

+0

Вам нужен клиент HTTP/HTTPS, такой как завиток. – SLaks

ответ

1
the code i wrote is as follow.please so kind to help me find the problem in it. 

/* File Name: server.c */ 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<errno.h> 
#include<sys/types.h> 
#include<sys/socket.h> 
#include<netinet/in.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#define DEFAULT_PORT 8002 
#define MAXLINE 4096 
#define GMAIL_ACCOUNTS_SERVER "accounts.google.com" 


static char gmail_request_token_url[] = "POST /o/oauth2/device/code HTTP/1.1\r\n" 
             "Host: accounts.google.com\r\n" 
             "Content-Type: application/x-www-form-urlencoded\r\n" 
             "Content-Length: 289\r\n" 
             "Accept: text/html,*/*\r\n" 
             "User-Agent: Mozilla/5.0\r\n" 
             "client_id=my.apps.googleusercontent.com&scope=email%20profile\r\n"; 

static char gmail_get_tokens[] ="POST /oauth2/v3/token HTTP/1.1\r\n" 
           "Host: accounts.google.com\r\n" 
           "Content-Type: application/x-www-form-urlencoded\r\n" 
           "Content-Length: 389\r\n" 
           "Accept: text/html,*/*\r\n" 
           "User-Agent: Mozilla/5.0\r\n" 
"client_id=my.apps.googleusercontent.com&client_secret={my_client_secret}&code=authentication_code&grant_type=http://oauth.net/grant_type/device/1.0\r\n"; 







void main(void) 
{ 
    int socket_fd = -1; 
    struct sockaddr_in servaddr; 
    struct sockaddr_in clientaddr; 
    char buff[4096]; 
    int  n; 
    struct hostent *host = NULL; 
    int reuse = 1; 

    struct timeval tv; 
    fd_set rset; 
    int ret = 0; 
    char requestbuffer[1024]={0}; 


    // printf("the sizeof the request array is %d\n",sizeof(gmail_request_token_url)); 


    if((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ 
     printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); 
     exit(0); 
    } 

    memset(buff,0,sizeof(buff)); 
    memset(&servaddr, 0, sizeof(servaddr)); 
    memset(&clientaddr,0,sizeof(clientaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(DEFAULT_PORT); 


    clientaddr.sin_family = AF_INET; 
    clientaddr.sin_port = htons(443); 


    if (setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)) < 0) 
    { 
     printf("fail to set socket reuse\n"); 
    } 
    else 
    { 
     printf("successfully set sock reuse\n"); 
    } 



    if(bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ 
     printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); 
     exit(0); 
    } 


    host = gethostbyname(GMAIL_ACCOUNTS_SERVER);//"get ip address of accounts.google.com" 
    if(host != NULL) 
    { 

     printf("successfully get google account name\n"); 
     clientaddr.sin_addr.s_addr = *(unsigned long *)host->h_addr_list[0]; 
     printf("the address is %s\n",inet_ntoa(clientaddr.sin_addr)); 

    } 
    else 
    { 
     printf("fail to get google account name\n"); 
     clientaddr.sin_addr.s_addr = inet_addr("216.58.217.205"); 

    } 



    if(connect(socket_fd, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0) 
    { 
     printf("connect error: %s(errno: %d)\n",strerror(errno),errno); 
     return; 

    } 
    else 
    { 
     printf("successfull connect to the server\n"); 

    } 



    // if(send(socket_fd, gmail_request_token_url, sizeof(gmail_request_token_url),0) == -1) 
    if(send(socket_fd, gmail_get_tokens, sizeof(gmail_get_tokens),0) == -1) 
    { 
     printf("fail to send content to google"); 
     // continue; 
    } 
    else 
    { 
     printf("successfulyy send request url %s\n",gmail_get_tokens); 
    } 
    FD_ZERO(&rset); 
    FD_SET(socket_fd,&rset); 


    while(1) 
    { 
     tv.tv_sec = 5; 
     tv.tv_usec = 0; 

     ret = select(socket_fd+1,&rset,NULL,NULL,&tv); 

     printf("the ret is %d\n",ret); 
     if (ret > 0) 
     { 
      printf("waiting for response from server\n"); 
      if (FD_ISSET(socket_fd,&rset)) 
      { 
       printf("it is the fd,response"); 
       n = recv(socket_fd, buff, 1024, 0); 
       if (n > 0) 
       { 
        printf("successfully recv content from the server\n"); 
        buff[n] = '\0'; 
        printf("recv msg from client: %s %s\n", buff,strerror(errno)); 
       } 

       else 
       { 
        printf("fail to recv any message from the server %s\n",strerror(errno)); 
        //close(fd); 
        //break; 

       } 
      } 

     } 
     else if(0 == ret) 
     { 
      printf("time out\n"); 
      continue; 
     } 
     else 
     { 
      printf("the ret is less than 0\n"); 
      continue; 
     } 


     sleep(1); 
    } 
    close(socket_fd); 
    // return 0; 
} 
0

Необходимо использовать HTTPS, если вы хотите подключиться к серверам google. На мой взгляд, самый простой способ заключается в использовании libcur, это пример кода, который выполняет запрос GET:

int main(void) 
{ 
    CURL *curl; 
    CURLcode res; 

    curl_global_init(CURL_GLOBAL_DEFAULT); 

    curl = curl_easy_init(); 
    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); 

/* Perform the request, res will get the return code */ 
     res = curl_easy_perform(curl); 

/* Check for errors */ 
     if(res != CURLE_OK) 
      fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 

/* always cleanup */ 
     curl_easy_cleanup(curl); 
    } 

    curl_global_cleanup(); 
    return 0; 
} 

Я взял этот пример кода из Libcurl веб-страницы: http://curl.haxx.se/libcurl/c/https.html

Чтобы отправить свой OAuth данных и превратить ваш запрос GET в запрос POST, вам просто нужно добавить данные в запрос HTTP с помощью этого вызова:

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "client_id=my.apps.googleusercontent.com&scope=email%20profile"); 
+0

Хорошо, я надеюсь, что это решит вашу точку ;-) – jimyx17