winhttp 访问https_「winhttp」C++用winhttp实现https访问服务器 - seo实验室

news/2024/5/21 5:25:54/文章来源:https://blog.csdn.net/weixin_39731107/article/details/114010001

winhttp

由于项目升级,在数据传输过程中需要经过oauth2.0认证,访问服务器需要https协议。

首先,实现C++代码访问https 服务器,实现Get和post功能,在网上搜索一通,发现各种各样的都有,有的很简单,有的稍微复杂。结果MSDN介绍的比较简洁一点

官方网址:https://docs.microsoft.com/en-us/windows/desktop/winhttp/ssl-in-winhttp

网友翻译:https://blog.csdn.net/edger2heaven/article/details/45664297

我们的要求还是相对比较简单,OAuth 采用客户端模式(client credentials)

参考阮一峰blog

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

60f8382277963f4bb8774f5c161fa637.png

它的步骤如下:

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,包含以下参数:

granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。

scope:表示权限范围,可选项。POST /token HTTP/1.1

Host: server.example.com

authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

content-Type: APPlication/x-www-form-urlencoded

grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。

B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

cache-Control: no-store

pragma: no-cache

{

"access_token":"2YotnFZFEjr1zCsicMWpAA",

"token_type":"example",

"expires_in":3600,

"example_parameter":"example_value"

}

以下是POST的代码,代码有点瑕疵,不能通用于普通项目,但是流程是通用的。

GET的代码也是大同小异,只是https头部信息有所不用

#include "stdafx.h"

#include "windows.h"

#include "winhttp.h"

#include "wchar.h"

#include "wincrypt.h"

#include

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

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

wstring string2wstring(const string &str)

{

_bstr_t tmp = str.c_str();

wchar_t* pwchar = (wchar_t*)tmp;

wstring ret = pwchar;

return ret;

}

void winhttp_client_post(){

LPSTR pszData = "WinHttpWriteData Example";

Dword dwBytesWritten = 0;

BOOL bResults = FALSE;

HINTERNET hsession = NULL,

hConnect = NULL,

hrequest = NULL;

// Use WinHttpOpen to obtain a session handle.

hSession = WinHttpOpen( L"A WinHTTP Example Program/1.0",

WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,

WINHTTP_NO_PROXY_NAME,

WINHTTP_NO_PROXY_BYPASS, 0);

// Specify an HTTP server.

if (hSession)

hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",

INTERNET_DEFAULT_HTTPS_PORT, 0);

// Create an HTTP Request handle.

if (hConnect)

hRequest = WinHttpOpenRequest( hConnect, L"POST",

L"/token",

NULL, WINHTTP_NO_referer,

WINHTTP_DEFAULT_ACCEPT_types,

0);

// Set HTTP Options

dword dwTimeOut = 3000;

DWORD dwFlags =SECURITY_FLAG_ignore_UNKNOWN_CA |

SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE |

SECURITY_FLAG_IGNORE_CERT_CN_INvalid |

SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;

BOOL bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_CONNECT_TIMEOUT, &dwTimeOut, sizeof(DWORD));

bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));

bRet = WinHttpSetOption(hRequest, WINHTTP_OPTION_CLIENT_CERT_context, WINHTTP_NO_CLIENT_CERT_CONTEXT, 0);

//加上OAuth认证需要的header信息:

std::string client_id = "test client id";

std::string client_secure = "test client security";

// client id and secure need base64 encode

std::wstring strHeader = L"Content-type:application/x-www-form-urlencoded\r\n";

strHeader += L"Authorization: Basic ";

//strHeader += string2wstring(tmsstring) +L"\r\n"; //tmsstring is client and secure after base64 encoding

bRet = WinHttpAddRequestHeader(hRequest, strHeader.c_str(), strHeader.length(), WINHTTP_ADDREQ_FLAG_ADD|WINHTTP_ADDREQ_FLAG_REPLACE);

// Send a Request.

std::string strTmp = "grant_type=client_credentials"; //OAuth认证模式是客户端模式

if (hRequest)

bResults = WinHttpSendRequest( hRequest,

WINHTTP_NO_ADDITIONAL_headers,

0, (LPVOID)strTmp.c_str(), strTmp.length(),

strTmp.length(), 0);

// Write data to the server. don't need this step

/*if (bResults)

bResults = WinHttpWriteData( hRequest, pszData,

(DWORD)strlen(pszData),

&dwBytesWritten);

*/

// End the request.

if (bResults)

bResults = WinHttpReceiveresponse( hRequest, NULL);

// Report any ERRORs.

if (!bResults)

printf("Error %d has occurred.\n",GetLastError());

//接收服务器返回数据

if(bRet)

{

char *pszOutBuf;

DWORD dwSize = 0;

DWORD dwDownLoaded = 0;

std::string strJson; //返回的是Json格式

do

{

if (!WinHttpQueryDataAvailable(hRequest, &dwSize))

{

//error log

}

pszOutBuf = new char[dwSize+1];

zeromemory(pszOutBuf, dwSize+1);

if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuf, dwSize, &dwDownLoaded) )

{

//error log

}

strJson += pszOutBuf;

}while(dwSize > 0);

}

// Close any open handles.

if (hRequest) WinHttpCloseHandle(hRequest);

if (hConnect) WinHttpCloseHandle(hConnect);

if (hSession) WinHttpCloseHandle(hSession);

}

相关阅读

大家都知道Press any key to continue…,在windows下的bat中只需要一个pause命令即可,那么shell的批处理该怎样实现这个功能呢,其实

问题描述:

自己实现一个MyStrcat函数,要和C语言库函数的strcat函数完成同样的功能。

问题分析: 首先我们要了解一下strcat函数它到

示例图:activity.xml文件布局<?xml version="1.0" encoding="utf-8"?>

xmlns:android="http://schemas.android

Structured Streaming 实现思路与实现概述

[酷玩 Spark] Structured Streaming 源码解析系列 ,返回目录请 猛戳这里「腾讯·广点

实现单选功能的控件一组RadioButton必须放在一个RadioGroup中 意思就是说单选按钮中的值我们可以看作是一个数组也就是这里说的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_813659.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中什么是动态网站环境及如何部署

当谈论起网站时&#xff0c;我们可能听说过静态和动态这两个词&#xff0c;但却不知道它们的含义&#xff0c;或者从字面意思了解一些却不知道它们的区别。 这一切可以追溯到网站和网络应用程序&#xff0c;Web应用程序是一个网站&#xff0c;但很多网站不是Web应用程序&#x…

外贸资源推荐:做外链做分类-61个高人气英国免费分类广告列表网站

外贸资源推荐&#xff1a;做外链做分类-61个高人气英国免费分类广告列表网站以下内容适合外贸网商&#xff0c;做外链 做分类广告-61个高人气英国免费分类广告列表网站<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr>&…

Zencart_SEO插件:ultimate_seo_urls的htaccess重写url规则

Zencart_SEO插件ultimate_seo_urls的htaccess伪静态重写url规则 #####NOTE:Replace/shop/withtherelativewebpathofyourcataloginthe"RewriteBase"linebelow: //启用重写规则 OptionsFollowSymLinks RewriteEngineOn //重写目录 RewriteBase/ #FromUltimateSEOURL…

ASP.NET 网站路径[转载]

文章来源:http://blog.csdn.net/winnerzone/archive/2007/05/10/1603044.aspx

重建索引要多久_网站关键词多久更新一次-top推

说起关键词&#xff0c;相信大多seoer都有非常深刻的认识&#xff0c;因为要做好网站&#xff0c;关键词的优化是最重要的一环&#xff0c;那么网站关键词多久更新一次对搜索引擎来说比较友好呢&#xff1f;接下去top推的小编就带大家一起来分析一下吧。网站关键词多久更新一次…

ufo帧率测试网站_帧率担当,i5-9600KF与电竞粉更配哦

嗨&#xff01;艾维巴蒂!这里是懂装机和爱玩游戏的雕哥&#xff01;作为一名电竞猛男&#xff0c;我的兴趣爱好无非就是开开黑、搞搞机&#xff0c;偶尔还会研究下Intel14mm拉链技术。不过呢&#xff0c;生活不只有游戏&#xff0c;还有诗和远方啊&#xff01;要攒机咱就得一步…

一步一步SharePoint 2007之六:改变一个网站的导航栏

一步一步操作过的朋友一定会发现&#xff0c;在Site Actions菜单中有两个有些类似的菜单项&#xff0c;一个是Modify Navigation&#xff0c;另外一个是Manager Content and Structure&#xff0c;这两个项目似乎都跟本篇文章要解决的问题有关。不过&#xff0c;在需要改变网站…

一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider...

摘要  前面的文章中&#xff0c;我们注册一个新用户后&#xff0c;需要手动加到网站的Members用户组中&#xff0c;这个用户才能真正可以访问网站&#xff0c;这点非常不符合我们的习惯&#xff0c;我们希望能够注册后&#xff0c;自动具备访问网站的权限。那么能不能实现这点…

zencart周末在线外贸建站实战案例练习交流-左栏菜单边框制作视频详解

左栏制作主要要熟悉和掌握边框的标题和边框容器内容的编辑与修改的技巧和经验 本视频任务完成如下图所示: 左栏制作 具体步骤和流程 整体到部分/局部 将目标站的css加到主站主样式 在前台调用 leftBoxContainer------box内容对换 详情请看在线 http://v.youku.com/v_show/id_…

messagebox弹框内容提交后怎么清空_买完域名和主机后如何做解析?- B2B外贸网站自建教程(3)...

前文提要&#xff1a;如何注册域名及其注意事项如何购买WordPress托管主机接下来对前两篇说到的三大域名注册商&#xff0c;分别介绍修改NS(域名服务器)的方法。将域名已有服务器改为Siteground主机的域名服务器&#xff0c;能让我们不用逐一配置网站的解析记录&#xff0c;省时…

2012年移动SEO启示

2012年是搜索营销真正成熟的一年 &#xff0c;手机成为增长最大的组成部分之一&#xff0c;其整体搜索市场已达到20&#xff05;的份额。移动媒体的出现&#xff0c;使得搜索引擎优化更难。 展望未来&#xff0c;预计到2012年一年&#xff0c;语义搜索Web 3.0&#xff0c;极大地…

nitc免费效益型企业网站php版 后台不能登陆,NITC(定海神真)免费效益型企业网站PHP版 V3.2...

NITC(定海神真)效益型网站管理系统.PHP特色&#xff1a;1. 网站设计精美&#xff1a;前台页面全部采用DIVCSS架构&#xff0c;设计严格规范&#xff0c;页面精美大气&#xff0c;布局合理。2. 管理操作方便&#xff1a;后台管理界面友好&#xff0c;使用方便&#xff0c;功能强…

2012年5月加拿大旅游网站排名

2019独角兽企业重金招聘Python工程师标准>>> 2012年5月排名&#xff1a;Expedia Canada居于旅游中介网站首位&#xff0c;TripAdvisor Canada居于目的地及住宿网站首位&#xff0c;Air Canada居于航空公司网站首位。 旅游中介 排名 网站名称 域名 访问率 1 Exp…

iis 加载图片很慢_如果网速快,你打开某些网站还是很慢,这些网站要小心

据近期调查&#xff0c;有40% 的用户&#xff0c; 会因为网站加载时间超过3秒而放弃访问&#xff0c;这年头&#xff0c;千兆光纤&#xff0c;4K视频串流&#xff0c;还有大型在线多人游戏遍地跑&#xff0c;为什么只包含文字和图片的网页&#xff0c;经常要等半天才能加载出来…

点击地图进入省级地图_原来还有这么全的地图素材网站

经常有小伙伴问“你们地图PPT再哪里找的”为啥我们找不到市级地图&#xff1f;为啥我们找出的素材都是这样的&#xff1f;今天我们就解密“地图素材网站&#xff1a;DATAV.GeoAtlas这个网站有全国地图&#xff0c;各省地图&#xff0c;各市地图关键都可以下载&#xff0c;导入P…

jQ网站幻灯片切换效果焦点图代码

一款大气的jQ网站幻灯片切换效果焦点图代码&#xff0c;有需要了解习的朋友可进入参考。 这款jQuery网站幻灯片切换效果焦点图非常大气,要是网站首页应用此款效果,必定是蓬荜生辉啊&#xff01;导入jquery代码代码如下复制代码<script src"http://libs.baidu.com/jque…

大规模企业网站集群如何实现会话保持?

大规模企业网站集群如何实现会话保持答网友老男孩群里的伙伴困惑:XXXXXX(44708xxxx6) 12:37:55请教个问题&#xff0c;我用lvs的rr模式&#xff0c;&#xff08;考虑过 ipvsadm -p&#xff0c;但是这样就失去了负载均衡的意义感觉&#xff09;&#xff0c;后端有10台web&#x…

网站初学笔记3-HTML实用元素2

HTML 链接 - name 属性 name 属性规定锚&#xff08;anchor&#xff09;的名称。您可以使用 name 属性创建 HTML 页面中的书签。书签不会以任何特殊方式显示&#xff0c;它对读者是不可见的。当使用命名锚&#xff08;named anchors&#xff09;时&#xff0c;我们可以创建直接…

Nibbler – 免费的网站测试和指标评分工具

Nibbler 是一款免费的工具&#xff0c;用于测试网站的各个方面指标。输入任意网站的地址&#xff0c;Nibbler 会给你一份报告&#xff0c;列出网站的10个关键领域的分数&#xff0c;包括可访问性&#xff0c;用户体验&#xff0c;搜索引擎优化&#xff0c;社交媒体和技术等等。…

20+个创意十足的斜线网站设计

大多数传统的网页都是直愣愣的竖直水平的设计。不过现在&#xff0c;斜线网页设计与视差滚动设计&#xff08;译者注&#xff1a;一种特殊的网页形式呈现形式&#xff0c;其基础原理是让多层背景以不同的速度搬动&#xff0c;形成立体的感觉&#xff0c;带来卓越的视觉体验&…