【Photoshop API 】三、C++获取 access_token

使用C++调用Adobe API获取JWT访问令牌
本文档介绍了如何使用C++通过JWT(JSON Web Token)与Adobe Identity Management Service (IMS)交互,以获取访问令牌。这个过程涉及向IMS发送POST请求,包含API密钥、客户端秘密和Base64编码的JWT。提供的C++代码示例展示了如何实现这一流程,注意令牌每24小时会过期,需要刷新。

获取办法:https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/JWT/JWT.md
前一篇:【Photoshop API 】curl工具获取 access_token

交换JWT以检索访问令牌

要启动API会话,请使用JWT通过向Adobe Identity Management Service(IMS)发出POST请求来从Adobe获取访问令牌。

  • 发送POST请求至:

https://ims-na1.adobelogin.com/ims/exchange/jwt

  • 请求的正文应包含带有您的客户端ID(API密钥),客户端密钥和JWT的URL编码参数:

client_id={api_key_value}&client_secret={client_secret_value}&jwt_token={base64_encoded_JWT}

请求参数

在POST请求的主体中传递URL编码的参数:

范围描述
client_id为您的集成生成的API密钥。
client_secret为您的集成生成的客户端机密。
jwt_token一个以base-64编码的JSON Web令牌,它封装了您的集成的身份,并用一个私钥签名,该私钥与附加到该集成的公钥证书相对应。

 

c++ 获取案例:

注意:您的令牌将每24小时过期,并且需要在过期后进行刷新

// POSTDemo2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <curl/curl.h>
#include <json/json.h>
#pragma warning(disable:4996)


using namespace std;
//get请求和post请求数据响应函数
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)
{
	//在注释的里面可以打印请求流,cookie的信息
	//cout << "----->reply" << endl;
	string *str = (string*)stream;
	//cout << *str << endl;
	(*str).append((char*)ptr, size*nmemb);
	return size * nmemb;
}
//http POST请求  
CURLcode curl_post_req(const string &url, const string &postParams, string &response)
{
	// curl初始化  
	CURL *curl = curl_easy_init();
	// curl返回值 
	CURLcode res;
	if (curl)
	{
		// set params
		//设置curl的请求头
		struct curl_slist* header_list = NULL;
		header_list = curl_slist_append(header_list, "Cache-Control: no-cache");
		header_list = curl_slist_append(header_list, "Content-Type: application/x-www-form-urlencoded");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

		//不接收响应头数据0代表不接收 1代表接收
		curl_easy_setopt(curl, CURLOPT_HEADER, 0);

		//设置请求为post请求
		curl_easy_setopt(curl, CURLOPT_POST, 1);

		//设置请求的URL地址
		curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
		//设置post请求的参数
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str());

		//设置ssl验证
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

		//CURLOPT_VERBOSE的值为1时,会显示详细的调试信息
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);

		curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);

		//设置数据接收和写入函数
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);

		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);

		//设置超时时间
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, 6);

		// 开启post请求
		res = curl_easy_perform(curl);
	}
	//释放curl 
	curl_easy_cleanup(curl);
	return res;
}
int main()
{
	string url_post0 = "https://ims-na1.adobelogin.com/ims/exchange/jwt/";
	string paramsLogin0 = "client_id=e2096177e13f4ad89c9bda489b7824e1&client_secret=9692444c-2b83-4f57-ac0d-bfa058dd868f&jwt_token=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2MTk1MTc0MzksImlzcyI6IjQ5QjcwNDZDNUY2RDhFNkQwQTQ5NUZEOEBBZG9iZU9yZyIsInN1YiI6IjUwODc3NjgxNjA4Njg2M0EwQTQ5NUM3MUB0ZWNoYWNjdC5hZG9iZS5jb20iLCJodHRwczovL2ltcy1uYTEuYWRvYmVsb2dpbi5jb20vcy9lbnRfY2Nhc19zZGsiOnRydWUsImF1ZCI6Imh0dHBzOi8vaW1zLW5hMS5hZG9iZWxvZ2luLmNvbS9jL2UyMDk2MTc3ZTEzZjRhZDg5YzliZGE0ODliNzgyNGUxIn0.TJGO_TN5opD0trnvc7VCNgB6a2UAj1OTR5lfIRtATR2YlC4KzXKiMtarRbOn6i2vwFRUMzLuUbi_E45IwPJChHmyfYprXiq9Wg9k4XNy0GTZq_8VzE9CZTKTlGbv_4aldQagOBtzegrOqGrLILvSXYbh8Hfb5SNRnnisAAdzpV2vUkQGfcTZl0QNDIagoJJiVis-HRyB4dGk74DlWM7r-1afBvoHv_Tl0pfhN-gMFq5hIN7ZEHHdNEaxGjb6p5XBr64x-r61kVrlSheIQbwDCcoFlFm4hIo-QXBh6Wr3IxfwM2B2Wm_l6sF-VcJm2Qq9Wyqbgzbb1VXKlUQ8ISGiJw";
	string resPost0;
	auto res3 = curl_post_req(url_post0, paramsLogin0, resPost0);
	if (res3 == CURLE_OK)
	{
		cout << resPost0 << endl;
	}

	getchar();
	return 0;
}



 

 

在使用 ApiPost 获取 `access_token` 后,可以在其他接口请求中通过请求头(Header)或请求参数(Query/Body)传递该 token,具体方式取决于目标 API 的设计规范。以下是几种常见的使用方式示例。 ### 在请求头中使用 `access_token` 许多 API 要求将 `access_token` 放在请求头的 `Authorization` 字段中,通常使用 `Bearer` 模式。例如: ```http GET /api/resource HTTP/1.1 Host: example.com Authorization: Bearer {access_token} ``` 在 ApiPost 中,可以将 `access_token` 存储为环境变量,然后在其他接口请求头中引用该变量: ```http GET /api/resource HTTP/1.1 Host: example.com Authorization: Bearer {{access_token}} ``` 其中 `{{access_token}}` 是 ApiPost 中定义的变量名。 ### 在请求参数中使用 `access_token` 部分 API 支持将 `access_token` 作为查询参数传入,例如: ```http GET /api/resource?access_token={access_token} HTTP/1.1 Host: example.com ``` 在 ApiPost 中,可以这样构造请求 URL: ```http GET /api/resource?access_token={{access_token}} HTTP/1.1 Host: example.com ``` ### 在请求体中使用 `access_token` 对于某些 POST 请求,可能需要将 `access_token` 放在请求体中,例如: ```json { "access_token": "{{access_token}}" } ``` ### 自动化获取并使用 `access_token` 在 ApiPost 中,可以通过预执行脚本(Pre-request Script)自动获取 `access_token` 并设置为环境变量,供后续接口使用。以下是一个示例脚本: ```javascript pm.sendRequest({ url: 'https://example.com/oauth/token', method: 'POST', header: { 'Content-Type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({ client_id: 'your_client_id', client_secret: 'your_client_secret', grant_type: 'client_credentials' }) } }, function (err, res) { if (err) { pm.test("获取 access_token 失败", function () { pm.expect(err).to.be.null; }); } else { var jsonData = res.json(); pm.environment.set("access_token", jsonData.access_token); } }); ``` 在后续接口中,可以直接使用 `{{access_token}}` 来引用这个 token。 ### 注意事项 - `access_token` 是敏感信息,应避免在日志、客户端或前端代码中暴露[^2]。 - 由于 `access_token` 通常具有时效性(例如 2 小时),建议在中控服务器统一管理 token获取和刷新逻辑,避免多个客户端同时请求刷新 token 导致冲突[^3]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值