{"id":862,"date":"2026-07-23T15:24:01","date_gmt":"2026-07-23T07:24:01","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/07\/23\/cloudflare-workers-%e8%b8%a9%e5%9d%91%e5%84%80%e8%a1%a8%e6%9d%bf%e7%b7%a8%e8%bc%af%e5%99%a8%e9%83%a8%e7%bd%b2%e6%9c%83%e6%b4%97%e6%8e%89-secret-401-%e9%ac%bc%e6%89%93%e7%89%86\/"},"modified":"2026-07-23T15:24:01","modified_gmt":"2026-07-23T07:24:01","slug":"cloudflare-workers-%e8%b8%a9%e5%9d%91%e5%84%80%e8%a1%a8%e6%9d%bf%e7%b7%a8%e8%bc%af%e5%99%a8%e9%83%a8%e7%bd%b2%e6%9c%83%e6%b4%97%e6%8e%89-secret-401-%e9%ac%bc%e6%89%93%e7%89%86","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/07\/23\/cloudflare-workers-%e8%b8%a9%e5%9d%91%e5%84%80%e8%a1%a8%e6%9d%bf%e7%b7%a8%e8%bc%af%e5%99%a8%e9%83%a8%e7%bd%b2%e6%9c%83%e6%b4%97%e6%8e%89-secret-401-%e9%ac%bc%e6%89%93%e7%89%86\/","title":{"rendered":"Cloudflare Workers \u8e29\u5751:\u5100\u8868\u677f\u7de8\u8f2f\u5668\u90e8\u7f72\u6703\u6d17\u6389 Secret\u2014\u2014401 \u9b3c\u6253\u7246\u5be6\u9304\u8207\u89e3\u6cd5"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u9019\u7bc7\u5728\u8b1b\u4ec0\u9ebc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u505a\u4e86\u4e00\u500b\u5f88\u55ae\u7d14\u7684\u56de\u5831\u7aef\u9ede:\u684c\u9762\u5de5\u5177\u5075\u6e2c\u5230\u300c\u95dc\u6ce8\u8edf\u9ad4\u300d\u6642,\u628a\u547d\u4e2d\u6e05\u55ae POST \u5230 Cloudflare Worker,Worker \u9a57\u904e Bearer token \u5f8c\u628a JSON \u5beb\u9032 R2\u3002\u67b6\u69cb\u7c21\u55ae\u5230\u4e0d\u884c,\u7d50\u679c\u5361\u4e86\u4e00\u6574\u500b\u4e0b\u5348\u2014\u2014<strong>\u4e0d\u7ba1\u600e\u9ebc\u8a2d\u5b9a token,\u6c38\u9060 HTTP 401<\/strong>\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u524d\u60c5\u63d0\u8981:\u9019\u9846 Worker \u7684\u5b9a\u4f4d\u3001\u9069\u7528\u5834\u666f\u8207\u57fa\u672c\u8a2d\u5b9a,\u5beb\u5728\u524d\u4e00\u7bc7[\u300aCloudflare Workers \u8e29\u5751\u7b46\u8a18:\u9069\u7528\u5834\u666f\u3001\u8a2d\u5b9a,\u4ee5\u53ca\u600e\u9ebc\u5b89\u5168\u5730\u7d50\u5408 R2\u300b](http:\/\/192.168.50.190\/wordpress\/2026\/07\/22\/cloudflare-workers-%e8%b8%a9%e5%9d%91%e7%ad%86%e8%a8%98%ef%bc%9a%e9%81%a9%e7%94%a8%e5%a0%b4%e6%99%af%e3%80%81%e8%a8%ad%e5%ae%9a%ef%bc%8c%e4%bb%a5%e5%8f%8a%e6%80%8e%e9%ba%bc%e5%ae%89%e5%85%a8%e5%9c%b0\/)\u3002\u90a3\u7bc7\u5efa\u8b70\u628a\u5171\u4eab token \u653e\u9032\u74b0\u5883 Secret\u2014\u2014\u672c\u7bc7\u5c31\u662f\u90a3\u500b\u5efa\u8b70\u5728\u771f\u5be6\u4e16\u754c\u7206\u70b8\u7684\u5b8c\u6574\u904e\u7a0b,\u4ee5\u53ca\u4fee\u6b63\u5f8c\u7684\u7d50\u8ad6\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5f8c\u6293\u5230\u7684\u5143\u5147\u5b8c\u5168\u51fa\u4e4e\u610f\u6599:<strong>Cloudflare \u5100\u8868\u677f\u7684\u300c\u7dda\u4e0a\u7de8\u8f2f\u5668\u300d\u90e8\u7f72\u7a0b\u5f0f\u78bc\u6642,\u6703\u628a\u300c\u8a2d\u5b9a\u9801\u300d\u5f8c\u4f86\u65b0\u589e\u6216\u8f2a\u63db\u7684 Secret \u7e6b\u7d50\u6574\u500b\u6d17\u6389<\/strong>\u3002\u4f60\u5728\u8a2d\u5b9a\u9801\u88dc\u597d secret\u3001\u56de\u7de8\u8f2f\u5668\u8cbc\u4e00\u7248\u7a0b\u5f0f\u78bc,secret \u5c31\u6b78\u96f6;\u518d\u88dc\u3001\u518d\u8cbc\u3001\u518d\u6b78\u96f6,\u9b3c\u6253\u7246\u5c31\u662f\u9019\u6a23\u6253\u8d77\u4f86\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7bc7\u5b8c\u6574\u8a18\u9304:\u7aef\u9ede\u600e\u9ebc\u8a2d\u8a08\u3001Worker \u600e\u9ebc\u8a2d\u5b9a\u3001401 \u600e\u9ebc\u4e00\u6b65\u6b65\u67e5\u5230\u771f\u76f8\u3001\u4e09\u7a2e\u89e3\u6cd5\u600e\u9ebc\u9078,\u4ee5\u53ca\u2014\u2014\u5982\u679c\u4f60\u60f3\u53eb AI \u5e6b\u4f60\u5f04\u9019\u5957,<strong>\u4e8b\u5148\u8981\u63d0\u9192\u5b83\u54ea\u4e9b\u4e8b<\/strong>\u624d\u4e0d\u6703\u91cd\u6f14\u6211\u7684\u4e0b\u5348\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u67b6\u69cb\u8a2d\u8a08<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9700\u6c42:\u6559\u5b78\u96fb\u8166\u4e0a\u7684\u6e05\u7406\u5de5\u5177\u6383\u5230\u7279\u5b9a\u8edf\u9ad4(\u4f8b\u5982\u7248\u672c\u904e\u820a\u7684\u58d3\u7e2e\u8edf\u9ad4)\u6642,\u56de\u5831\u5230\u96c6\u4e2d\u7aef\u9ede,\u7ba1\u7406\u8005\u4e8b\u5f8c\u67e5\u95b1\u3002<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\u684c\u9762\u5de5\u5177 client                Cloudflare Worker              R2 bucket\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500                \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500              \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nPOST JSON            \u2500\u2500\u25ba      \u9a57 Bearer token       \u2500\u2500\u25ba      classroom\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u4e3b\u6a5f\u540d<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u6642\u9593\u6233<\/span>&gt;<\/span>.json\nAuthorization:                \u88dc received_at\u3001\nBearer <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u5171\u4eabtoken<\/span>&gt;<\/span>             \u4f86\u6e90 IP(cf-connecting-ip)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5b89\u5168\u8a2d\u8a08\u7684\u91cd\u9ede\u53ea\u6709\u4e00\u689d:<strong>R2 \u7684 Access Key \u6c38\u9060\u4e0d\u51fa Worker<\/strong>\u3002client \u53ea\u62ff\u5230\u300c\u7db2\u5740\uff0b\u4e00\u500b\u53ea\u80fd\u5beb\u5165\u7684\u5171\u4eab token\u300d,token \u5916\u6d29\u6700\u591a\u88ab\u704c\u5783\u573e\u8cc7\u6599,\u62ff\u4e0d\u5230 bucket \u7684\u8b80\/\u522a\u6b0a\u9650,\u8981\u6b62\u8840\u53ea\u9700\u63db\u6389 token\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Worker \u8a2d\u5b9a\u6b65\u9a5f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u5efa\u7acb Worker \u8207 R2 bucket<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Cloudflare \u5100\u8868\u677f \u2192 <strong>Workers \u548c Pages<\/strong> \u2192 \u5efa\u7acb Worker(\u53d6\u540d\u5982 <code>my-report<\/code>)<\/li>\n\n\n<li><strong>R2 \u7269\u4ef6\u5132\u5b58<\/strong> \u2192 \u5efa\u7acb bucket(\u53d6\u540d\u5982 <code>reports<\/code>)<\/li>\n\n\n<li>Worker \u2192 <strong>\u7e6b\u7d50<\/strong> \u2192 \u65b0\u589e\u7e6b\u7d50 \u2192 R2 \u8caf\u9ad4,\u8b8a\u6578\u540d\u7a31\u53d6 <code>CLASSROOM_BUCKET<\/code>,\u6307\u5411\u525b\u5efa\u7684 bucket<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">2. Worker \u7a0b\u5f0f\u78bc(\u6700\u7d42\u7248,\u53ef\u76f4\u63a5\u6284)<\/h3>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ \u5171\u4eab\u4e0a\u50b3 token:\u8207 client \u5167\u5efa\u503c\u4e00\u81f4\u3002<\/span>\n<span class=\"hljs-comment\">\/\/ \u7522\u751f\u65b9\u5f0f:openssl rand -hex 24(48 \u5b57\u5143\u5341\u516d\u9032\u4f4d)<\/span>\n<span class=\"hljs-comment\">\/\/ \u76f4\u63a5\u5beb\u5728\u7a0b\u5f0f\u78bc\u88e1\u800c\u4e0d\u7528 env secret \u7684\u539f\u56e0,\u898b\u4e0b\u65b9\u8e29\u5751\u6bb5\u843d\u3002<\/span>\n<span class=\"hljs-keyword\">const<\/span> UPLOAD_TOKEN = <span class=\"hljs-string\">\"&lt;\u4f60\u768448\u5b57\u5143\u96a8\u6a5ftoken&gt;\"<\/span>;\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  <span class=\"hljs-keyword\">async<\/span> fetch(request, env) {\n    <span class=\"hljs-keyword\">if<\/span> (request.method !== <span class=\"hljs-string\">\"POST\"<\/span>) {\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(<span class=\"hljs-string\">\"Method Not Allowed\"<\/span>, { <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-number\">405<\/span> });\n    }\n    <span class=\"hljs-keyword\">const<\/span> got = (request.headers.get(<span class=\"hljs-string\">\"authorization\"<\/span>) || <span class=\"hljs-string\">\"\"<\/span>).trim();\n    <span class=\"hljs-keyword\">if<\/span> (got !== <span class=\"hljs-string\">\"Bearer \"<\/span> + UPLOAD_TOKEN) {\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(<span class=\"hljs-string\">\"Unauthorized\"<\/span>, { <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-number\">401<\/span> });\n    }\n    <span class=\"hljs-keyword\">let<\/span> payload;\n    <span class=\"hljs-keyword\">try<\/span> {\n      payload = <span class=\"hljs-keyword\">await<\/span> request.json();\n    } <span class=\"hljs-keyword\">catch<\/span> {\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(<span class=\"hljs-string\">\"Bad Request\"<\/span>, { <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-number\">400<\/span> });\n    }\n    <span class=\"hljs-comment\">\/\/ \u4f86\u6e90 IP \u7531 Worker \u9019\u908a\u53d6,client \u4e0d\u7528\u81ea\u5df1\u6293<\/span>\n    <span class=\"hljs-keyword\">const<\/span> record = {\n      <span class=\"hljs-attr\">received_at<\/span>: <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Date<\/span>().toISOString(),\n      <span class=\"hljs-attr\">source_ip<\/span>: request.headers.get(<span class=\"hljs-string\">\"cf-connecting-ip\"<\/span>) || <span class=\"hljs-string\">\"unknown\"<\/span>,\n      ...payload,\n    };\n    <span class=\"hljs-keyword\">const<\/span> machine = <span class=\"hljs-built_in\">String<\/span>(payload.machine_id || <span class=\"hljs-string\">\"unknown\"<\/span>).replace(<span class=\"hljs-regexp\">\/&#91;^a-zA-Z0-9_-]\/g<\/span>, <span class=\"hljs-string\">\"_\"<\/span>);\n    <span class=\"hljs-keyword\">const<\/span> key = <span class=\"hljs-string\">`classroom\/<span class=\"hljs-subst\">${machine}<\/span>-<span class=\"hljs-subst\">${<span class=\"hljs-built_in\">Date<\/span>.now()}<\/span>.json`<\/span>;\n    <span class=\"hljs-keyword\">await<\/span> env.CLASSROOM_BUCKET.put(key, <span class=\"hljs-built_in\">JSON<\/span>.stringify(record, <span class=\"hljs-literal\">null<\/span>, <span class=\"hljs-number\">2<\/span>), {\n      <span class=\"hljs-attr\">httpMetadata<\/span>: { <span class=\"hljs-attr\">contentType<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span> },\n    });\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(<span class=\"hljs-built_in\">JSON<\/span>.stringify({ <span class=\"hljs-attr\">ok<\/span>: <span class=\"hljs-literal\">true<\/span>, key }), {\n      <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-number\">200<\/span>,\n      <span class=\"hljs-attr\">headers<\/span>: { <span class=\"hljs-string\">\"content-type\"<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span> },\n    });\n  },\n};\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">3. client \u7aef<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4efb\u4f55\u8a9e\u8a00\u90fd\u884c,\u91cd\u9ede\u53ea\u6709\u4e09\u4ef6\u4e8b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>POST<\/code>\u3001<code>content-type: application\/json<\/code><\/li>\n\n\n<li><code>Authorization: Bearer &lt;\u540c\u4e00\u500btoken&gt;<\/code><\/li>\n\n\n<li>\u5931\u6557\u4e0d\u8981\u5f71\u97ff\u4e3b\u6d41\u7a0b(\u56de\u5831\u662f\u8f14\u52a9\u529f\u80fd)<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u9a57\u8b49(\u6574\u5957\u4fee\u5b8c\u5c31\u9760\u9019\u500b)<\/h3>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \u6b63\u78ba token \u2192 \u9810\u671f 200 {\"ok\":true,...}<\/span>\ncurl -sS -w <span class=\"hljs-string\">\"\\nHTTP %{http_code}\\n\"<\/span> -X POST <span class=\"hljs-string\">\"https:\/\/&lt;\u4f60\u7684worker&gt;.workers.dev\/\"<\/span> \\\n  -H <span class=\"hljs-string\">\"content-type: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"authorization: Bearer &lt;\u4f60\u7684token&gt;\"<\/span> \\\n  -d <span class=\"hljs-string\">'{\"machine_id\":\"test\",\"matches\":&#91;]}'<\/span>\n\n<span class=\"hljs-comment\"># \u932f\u8aa4 token \u2192 \u9810\u671f 401<\/span>\ncurl -sS -o \/dev\/<span class=\"hljs-keyword\">null<\/span> -w <span class=\"hljs-string\">\"HTTP %{http_code}\\n\"<\/span> -X POST <span class=\"hljs-string\">\"https:\/\/&lt;\u4f60\u7684worker&gt;.workers.dev\/\"<\/span> \\\n  -H <span class=\"hljs-string\">\"authorization: Bearer wrong\"<\/span> -d <span class=\"hljs-string\">'{}'<\/span>\n\n<span class=\"hljs-comment\"># GET \u2192 \u9810\u671f 405<\/span>\ncurl -sS -o \/dev\/<span class=\"hljs-keyword\">null<\/span> -w <span class=\"hljs-string\">\"HTTP %{http_code}\\n\"<\/span> <span class=\"hljs-string\">\"https:\/\/&lt;\u4f60\u7684worker&gt;.workers.dev\/\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u689d\u5168\u904e\u624d\u7b97\u901a\u3002<strong>\u53ea\u6e2c\u6b63\u5411\u8def\u5f91\u7b49\u65bc\u6c92\u6e2c\u3002<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8e29\u5751\u5be6\u9304:401 \u9b3c\u6253\u7246<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u75c7\u72c0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u59cb\u8a2d\u8a08\u662f\u628a token \u653e\u5728 Worker \u7684\u74b0\u5883 Secret(<code>env.UPLOAD_TOKEN<\/code>),\u7a0b\u5f0f\u78bc\u9019\u6a23\u6bd4\u5c0d:<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (request.headers.get(<span class=\"hljs-string\">\"authorization\"<\/span>) !== <span class=\"hljs-string\">`Bearer <span class=\"hljs-subst\">${env.UPLOAD_TOKEN}<\/span>`<\/span>) {\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(<span class=\"hljs-string\">\"Unauthorized\"<\/span>, { <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-number\">401<\/span> });\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">client \u7aef 401\u3002curl \u624b\u6253\u540c\u4e00\u500b token,\u4e5f\u662f 401\u3002\u5728\u8a2d\u5b9a\u9801\u300c\u8f2a\u63db\u300dsecret \u91cd\u8cbc\u4e00\u6b21,\u9084\u662f 401\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u7b2c\u4e00\u8f2a\u731c\u6e2c:\u8cbc\u4e0a\u593e\u4e86\u63db\u884c?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f9e\u804a\u5929\u8996\u7a97\/\u7de8\u8f2f\u5668\u8907\u88fd token \u6642,\u5c3e\u7aef\u5f88\u5bb9\u6613\u5e36\u4e00\u500b\u63db\u884c,\u800c Cloudflare \u7684 secret <strong>\u4e0d\u6703\u81ea\u52d5 trim<\/strong>,<code>Bearer abc\\n<\/code> \u6c38\u9060\u4e0d\u7b49\u65bc <code>Bearer abc<\/code>\u3002\u65bc\u662f\u628a\u6bd4\u5c0d\u6539\u6210\u5169\u908a\u90fd trim:<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> expected = <span class=\"hljs-string\">\"Bearer \"<\/span> + <span class=\"hljs-built_in\">String<\/span>(env.UPLOAD_TOKEN || <span class=\"hljs-string\">\"\"<\/span>).trim();\n<span class=\"hljs-keyword\">const<\/span> got = (request.headers.get(<span class=\"hljs-string\">\"authorization\"<\/span>) || <span class=\"hljs-string\">\"\"<\/span>).trim();\n<span class=\"hljs-keyword\">if<\/span> (!env.UPLOAD_TOKEN || got !== expected) { ... }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u90e8\u7f72,\u91cd\u6e2c\u2014\u2014<strong>\u9084\u662f 401<\/strong>\u3002\u9019\u4e00\u6b65\u6392\u9664\u4e86\u7a7a\u767d\u554f\u984c,\u4f46\u4e5f\u4ee3\u8868\u554f\u984c\u6bd4\u60f3\u50cf\u4e2d\u6df1\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u95dc\u9375\u4e00\u6b65:\u5225\u518d\u731c,\u76f4\u63a5\u8b93 Worker \u81ea\u5df1\u62db<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u52a0\u4e00\u500b\u66ab\u6642\u7684\u8a3a\u65b7\u5206\u652f,GET \u6642\u56de\u50b3 secret \u7684<strong>\u9577\u5ea6\u548c SHA-256<\/strong>(\u4e0d\u6d29\u6f0f\u503c\u672c\u8eab,\u53ef\u4ee5\u653e\u5fc3\u5728\u6b63\u5f0f\u74b0\u5883\u77ed\u66ab\u4f7f\u7528):<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (request.method === <span class=\"hljs-string\">\"GET\"<\/span>) {\n  <span class=\"hljs-keyword\">const<\/span> raw = <span class=\"hljs-built_in\">String<\/span>(env.UPLOAD_TOKEN ?? <span class=\"hljs-string\">\"\"<\/span>);\n  <span class=\"hljs-keyword\">const<\/span> data = <span class=\"hljs-keyword\">new<\/span> TextEncoder().encode(raw.trim());\n  <span class=\"hljs-keyword\">const<\/span> digest = <span class=\"hljs-keyword\">await<\/span> crypto.subtle.digest(<span class=\"hljs-string\">\"SHA-256\"<\/span>, data);\n  <span class=\"hljs-keyword\">const<\/span> hex = &#91;...new <span class=\"hljs-built_in\">Uint8Array<\/span>(digest)].map(<span class=\"hljs-function\">(<span class=\"hljs-params\">b<\/span>) =&gt;<\/span> b.toString(<span class=\"hljs-number\">16<\/span>).padStart(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-string\">\"0\"<\/span>)).join(<span class=\"hljs-string\">\"\"<\/span>);\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Response(\n    <span class=\"hljs-built_in\">JSON<\/span>.stringify({ <span class=\"hljs-attr\">len_raw<\/span>: raw.length, <span class=\"hljs-attr\">len_trimmed<\/span>: raw.trim().length, <span class=\"hljs-attr\">sha256_trimmed<\/span>: hex }),\n    { <span class=\"hljs-attr\">headers<\/span>: { <span class=\"hljs-string\">\"content-type\"<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span> } },\n  );\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6a5f\u7b97\u51fa\u6b63\u78ba token \u7684\u96dc\u6e4a\u4f86\u5c0d:<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">printf <span class=\"hljs-string\">'%s'<\/span> <span class=\"hljs-string\">\"&lt;\u4f60\u7684token&gt;\"<\/span> | sha256sum\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u7d50\u679c\u4e00\u7ffb\u5169\u77aa\u773c:<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{<span class=\"hljs-attr\">\"len_raw\"<\/span>:<span class=\"hljs-number\">0<\/span>,<span class=\"hljs-attr\">\"len_trimmed\"<\/span>:<span class=\"hljs-number\">0<\/span>,<span class=\"hljs-attr\">\"sha256_trimmed\"<\/span>:<span class=\"hljs-string\">\"e3b0c442...\"<\/span>}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>len_raw: 0<\/code>\u2014\u2014<strong><code>env.UPLOAD_TOKEN<\/code> \u6839\u672c\u662f\u7a7a\u7684<\/strong>(<code>e3b0c442...<\/code> \u662f\u7a7a\u5b57\u4e32\u7684 SHA-256,\u770b\u5230\u9019\u4e32\u76f4\u63a5\u53ef\u4ee5\u80cc\u8d77\u4f86)\u3002\u4e0d\u662f token \u8cbc\u932f,\u662f secret \u6574\u500b\u4e0d\u5b58\u5728\u65bc\u7dda\u4e0a\u7248\u672c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u771f\u76f8:\u5100\u8868\u677f\u7de8\u8f2f\u5668\u90e8\u7f72\u6703\u6d17\u6389 Secret<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c0d\u7167\u300c\u90e8\u7f72\u300d\u9801\u7684\u7248\u672c\u6b77\u7a0b\u8a18\u9304,\u6642\u9593\u7dda\u9577\u9019\u6a23:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u7248\u672c\u52d5\u4f5c<\/th>\n<th>Secret \u72c0\u614b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u8a2d\u5b9a\u9801:\u65b0\u589e\u7955\u5bc6 UPLOAD_TOKEN<\/td>\n<td>\u2705 \u6709<\/td>\n<\/tr>\n<tr>\n<td>\u7de8\u8f2f\u5668:\u8cbc\u7a0b\u5f0f\u78bc \u2192 \u5df2\u624b\u52d5\u90e8\u7f72<\/td>\n<td>\u274c <strong>\u88ab\u6d17\u6389<\/strong><\/td>\n<\/tr>\n<tr>\n<td>\u8a2d\u5b9a\u9801:\u8f2a\u63db\u7955\u5bc6(\u4ee5\u70ba\u4fee\u597d\u4e86)<\/td>\n<td>\u2705 \u6709<\/td>\n<\/tr>\n<tr>\n<td>\u7de8\u8f2f\u5668:\u518d\u8cbc\u7a0b\u5f0f\u78bc \u2192 \u5df2\u624b\u52d5\u90e8\u7f72<\/td>\n<td>\u274c <strong>\u53c8\u88ab\u6d17\u6389<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6a5f\u5236:Workers \u7684\u6bcf\u500b\u300c\u7248\u672c\u300d\u90fd\u662f<strong>\u7a0b\u5f0f\u78bc\uff0b\u7e6b\u7d50\u8a2d\u5b9a\u7684\u5b8c\u6574\u5feb\u7167<\/strong>\u3002\u7dda\u4e0a\u7de8\u8f2f\u5668(\u5167\u5d4c VS Code)\u90e8\u7f72\u6642,\u7528\u7684\u662f<strong>\u7de8\u8f2f\u5668\u8f09\u5165\u7576\u4e0b<\/strong>\u7684\u7e6b\u7d50\u5feb\u7167\u2014\u2014\u5982\u679c\u4f60\u7684\u7de8\u8f2f\u5668\u5206\u9801\u662f\u5728 secret \u8a2d\u597d<strong>\u4e4b\u524d<\/strong>\u958b\u7684,\u5b83\u90e8\u7f72\u51fa\u4f86\u7684\u65b0\u7248\u672c\u5c31\u4e0d\u542b\u90a3\u500b secret\u3002\u8a2d\u5b9a\u9801\u770b\u8d77\u4f86\u9084\u986f\u793a\u300c\u503c\u5df2\u52a0\u5bc6\u300d(\u5b83\u986f\u793a\u7684\u662f\u81ea\u5df1\u90a3\u689d\u7248\u672c\u7dda),\u4f46<strong>\u5be6\u969b\u4e0a\u7dda\u7684\u7248\u672c\u88e1\u4ec0\u9ebc\u90fd\u6c92\u6709<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5169\u908a\u7684 UI \u5404\u81ea\u5448\u73fe\u81ea\u5df1\u8a8d\u77e5\u7684\u72c0\u614b,\u6c92\u6709\u4efb\u4f55\u8b66\u544a\u3002\u9019\u5c31\u662f\u9b3c\u6253\u7246\u7684\u5b8c\u6574\u6210\u56e0:\u6bcf\u6b21\u5728\u8a2d\u5b9a\u9801\u88dc secret \u90fd\u771f\u7684\u88dc\u4e0a\u4e86,\u6bcf\u6b21\u56de\u7de8\u8f2f\u5668\u90e8\u7f72\u7a0b\u5f0f\u78bc\u53c8\u90fd\u771f\u7684\u628a\u5b83\u84cb\u6389\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u7a2e\u89e3\u6cd5<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>\u9806\u5e8f\u7d00\u5f8b<\/strong>:\u6240\u6709\u7a0b\u5f0f\u78bc\u4fee\u6539\u5148\u505a\u5b8c,<strong>secret \u7684\u65b0\u589e\/\u8f2a\u63db\u6c38\u9060\u7576\u6700\u5f8c\u4e00\u6b65<\/strong>(\u5f9e\u8a2d\u5b9a\u9801\u90e8\u7f72\u6703\u4ee5\u300c\u76ee\u524d\u7dda\u4e0a\u7a0b\u5f0f\u78bc\uff0b\u65b0 secret\u300d\u5efa\u7248,\u4e0d\u6703\u53cd\u904e\u4f86\u6d17\u6389\u7a0b\u5f0f\u78bc)\u3002\u53e6\u5916\u7de8\u8f2f\u5668\u5206\u9801\u7528\u5b8c\u5c31\u95dc,\u6bcf\u6b21\u8981\u6539 code \u91cd\u65b0\u958b,\u78ba\u4fdd\u5b83\u8f09\u5230\u6700\u65b0\u7e6b\u7d50\u3002\u7f3a\u9ede:\u9760\u4eba\u7684\u7d00\u5f8b,\u9072\u65e9\u518d\u72af\u3002<\/li>\n\n\n<li><strong>\u6539\u7528 wrangler<\/strong>:<code>wrangler deploy<\/code> + <code>wrangler secret put<\/code> \u7684\u884c\u70ba\u662f\u660e\u78ba\u7684,\u4e0d\u6703\u6709\u5feb\u7167\u932f\u4e82\u3002\u7f3a\u9ede:\u8981\u88dd\u5de5\u5177\u3001\u8981 OAuth \u767b\u5165,\u81e8\u6642\u4fee\u500b\u6771\u897f\u6642\u53cd\u800c\u662f\u984d\u5916\u963b\u529b(\u6211\u9019\u6b21 wrangler OAuth \u6d41\u7a0b\u4e5f\u53e6\u5916\u8e29\u4e86 callback \u4f54\u57e0\u7684\u5751,\u53c8\u662f\u53e6\u4e00\u500b\u6545\u4e8b)\u3002<\/li>\n\n\n<li><strong>token \u76f4\u63a5\u5beb\u9032 Worker \u7a0b\u5f0f\u78bc<\/strong>(\u672c\u6848\u6700\u7d42\u63a1\u7528):<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ec0\u9ebc\u6642\u5019<strong>\u4e0d\u80fd<\/strong>\u9019\u6a23\u505a:token \u771f\u7684\u662f\u6a5f\u5bc6(API \u91d1\u9470\u3001DB \u5bc6\u78bc)\u3001\u6703\u9032\u7248\u672c\u63a7\u5236\u516c\u958b repo\u3001\u6216\u591a\u4eba\u5171\u7528\u5e33\u865f\u770b\u5f97\u5230\u7a0b\u5f0f\u78bc\u4f46\u4e0d\u8a72\u770b\u5230\u503c\u2014\u2014\u9019\u4e9b\u60c5\u6cc1\u4e56\u4e56\u7528 secret + \u9806\u5e8f\u7d00\u5f8b\u6216 wrangler\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5982\u679c\u8981 AI \u5e6b\u4f60\u505a,\u5148\u63d0\u9192\u5b83\u9019\u4e9b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u6b21\u6574\u6bb5\u9664\u932f\u6211\u662f\u548c AI(Claude Code)\u5354\u4f5c\u5b8c\u6210\u7684\u3002\u4e8b\u5f8c\u56de\u9867,\u5982\u679c\u4e00\u958b\u59cb\u5c31\u628a\u4e0b\u9762\u9019\u4e9b\u8a71\u5beb\u9032\u63d0\u793a\u8a5e,\u81f3\u5c11\u7701\u4e00\u534a\u6642\u9593\u3002\u4f60\u53ef\u4ee5\u76f4\u63a5\u6284\u9019\u6bb5\u7d66\u4f60\u7684 AI:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">1. **\u4f60\u53ef\u4ee5\u76f4\u63a5 curl \u6e2c\u8a66\u7aef\u9ede**,401\/200 \u7576\u5834\u898b\u771f\u7ae0,\u4e0d\u8981\u7528\u300c\u61c9\u8a72\u53ef\u4ee5\u4e86\u300d\u56de\u5831\u6211;\u4fee\u597d\u7684\u5b9a\u7fa9\u662f\u6b63\u5411\uff0b\u53cd\u5411\u6e2c\u8a66\u5168\u904e\u3002<br>2. **Cloudflare \u5100\u8868\u677f\u7684\u7dda\u4e0a\u7a0b\u5f0f\u78bc\u7de8\u8f2f\u5668\u4f60\u64cd\u4f5c\u4e0d\u4e86**(\u5167\u5d4c VS Code,\u700f\u89bd\u5668\u81ea\u52d5\u5316\u7684\u9ede\u64ca\u548c\u9375\u76e4\u4e8b\u4ef6\u6253\u4e0d\u9032\u53bb)\u3002\u9700\u8981\u6539 Worker \u7a0b\u5f0f\u78bc\u6642,\u76f4\u63a5\u7d66\u6211\u5b8c\u6574\u6a94\u6848,\u6211\u4eba\u5de5\u8cbc\u4e0a\u90e8\u7f72,\u4f60\u8ca0\u8cac\u9a57\u8b49\u3002<br>3. **Secret \u7684\u503c\u4e0d\u8981\u53eb\u6211\u4e00\u500b\u5b57\u4e00\u500b\u5b57\u6253**,\u4e5f\u4e0d\u8981\u4f60\u4f86\u8cbc(\u5b89\u5168\u898f\u7bc4\u4f60\u672c\u4f86\u5c31\u4e0d\u80fd\u78b0\u6191\u8b49\u6b04\u4f4d)\u3002\u6d41\u7a0b\u8a2d\u8a08\u6210:\u4f60\u958b\u597d\u6b04\u4f4d\u2192\u6211\u8cbc\u2192\u4f60\u9a57\u8b49\u7d50\u679c\u3002<br>4. **\u61f7\u7591 secret \u6709\u554f\u984c\u6642,\u5148\u52a0\u8a3a\u65b7\u5206\u652f\u62ff\u8b49\u64da**(\u56de\u50b3\u9577\u5ea6+\u96dc\u6e4a,\u4e0d\u6d29\u6f0f\u503c),\u4e0d\u8981\u5728\u300c\u53ef\u80fd\u8cbc\u932f\u4e86\u300d\u4e0a\u9762\u7e5e\u5708\u3002\u7a7a\u5b57\u4e32\u7684 SHA-256 \u662f <code>e3b0c442...<\/code>,\u770b\u5230\u5b83\u5c31\u662f\u6839\u672c\u6c92\u8a2d\u503c\u3002<br>5. **\u6ce8\u610f Cloudflare \u7684\u7248\u672c\u5feb\u7167\u9677\u9631**:\u5f9e\u7dda\u4e0a\u7de8\u8f2f\u5668\u90e8\u7f72\u6703\u7528\u7de8\u8f2f\u5668\u8f09\u5165\u7576\u4e0b\u7684\u7e6b\u7d50\u5feb\u7167,\u53ef\u80fd\u6d17\u6389\u8a2d\u5b9a\u9801\u5f8c\u4f86\u52a0\u7684 secret\u3002\u90e8\u7f72\u9806\u5e8f\u6c38\u9060\u662f\u300c\u7a0b\u5f0f\u78bc\u5148\u3001secret \u6700\u5f8c\u300d,\u800c\u4e14\u6539\u5b8c\u8981\u7528\u7248\u672c\u6b77\u7a0b\u8a18\u9304\u5c0d\u6642\u9593\u7dda\u3002<br>6. **wrangler login \u662f\u4e92\u52d5\u5f0f OAuth**,\u5728\u4f60\u7684 shell \u88e1\u8dd1\u5f88\u5bb9\u6613 callback \u65b7\u6389\u6216\u591a\u500b\u7a0b\u5e8f\u6436 8976 \u57e0\u3002\u8981\u7528 wrangler \u5c31\u8b93\u6211\u5728\u81ea\u5df1\u7684\u7d42\u7aef\u6a5f\u767b\u597d\u518d\u8aaa,\u4e0d\u7136\u5c31\u63db\u8def\u3002<br>7. \u5361\u4f4f\u5169\u4e09\u6b21\u5c31\u505c\u4e0b\u4f86\u63db\u65b9\u6cd5,\u4e0d\u8981\u5c0d\u540c\u4e00\u9762\u7246\u91cd\u8907\u885d\u523a\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u904e\u4f86\u8aaa,AI \u5728\u9019\u6b21\u5e6b\u4e0a\u5927\u5fd9\u7684\u5730\u65b9\u4e5f\u503c\u5f97\u8a18:<strong>\u5b83\u53ef\u4ee5\u7121\u9650\u8010\u5fc3\u5730 curl\u3001\u6bd4\u5c0d\u96dc\u6e4a\u3001\u7ffb\u7248\u672c\u6b77\u7a0b\u627e\u6642\u9593\u7dda\u77db\u76fe<\/strong>\u2014\u2014\u9019\u4e9b\u6a5f\u68b0\u6027\u9a57\u8b49\u4ea4\u7d66\u5b83,\u4eba\u53ea\u8ca0\u8cac\u8cbc\u4e0a\u548c\u6309\u90e8\u7f72,\u5206\u5de5\u5176\u5be6\u975e\u5e38\u8212\u670d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7e3d\u7d50<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Cloudflare Workers \u7684\u300c\u7248\u672c\u300d\u662f\u7a0b\u5f0f\u78bc\uff0b\u7e6b\u7d50\u7684\u5b8c\u6574\u5feb\u7167;<strong>\u7dda\u4e0a\u7de8\u8f2f\u5668\u90e8\u7f72\u53ef\u80fd\u7528\u820a\u5feb\u7167\u6d17\u6389\u65b0 secret<\/strong>,\u800c\u4e14 UI \u4e0d\u6703\u8b66\u544a\u4f60\u3002<\/li>\n\n\n<li>\u9664\u932f\u6191\u8b49\u554f\u984c\u7684\u6b63\u89e3\u662f<strong>\u8b93\u4f3a\u670d\u5668\u7aef\u81ea\u5df1\u5831\u544a\u72c0\u614b<\/strong>(\u9577\u5ea6+\u96dc\u6e4a),\u4e00\u767c\u8a3a\u65b7\u8acb\u6c42\u52dd\u904e\u5341\u6b21\u76f2\u731c\u91cd\u8cbc\u3002<\/li>\n\n\n<li>token \u653e secret \u9084\u662f\u5beb\u9032\u7a0b\u5f0f\u78bc,\u53d6\u6c7a\u65bc<strong>\u5b83\u662f\u4e0d\u662f\u771f\u7684\u6a5f\u5bc6<\/strong>\u2014\u2014\u5df2\u7d93\u96a8 client \u6563\u5e03\u7684\u5171\u4eab token,\u5beb\u9032\u7a0b\u5f0f\u78bc\u53cd\u800c\u6d88\u6ec5\u4e86\u4e00\u6574\u985e\u90e8\u7f72\u4e8b\u6545\u3002<\/li>\n\n\n<li>\u548c AI \u5354\u4f5c\u8655\u7406\u96f2\u7aef\u8a2d\u5b9a\u6642,\u628a\u300c\u5b83\u505a\u4e0d\u5230\u7684\u4e8b\u300d(\u64cd\u4f5c\u5167\u5d4c\u7de8\u8f2f\u5668\u3001\u78b0\u6191\u8b49)\u548c\u300c\u5b83\u6700\u64c5\u9577\u7684\u4e8b\u300d(API \u9a57\u8b49\u3001\u8b49\u64da\u8490\u96c6)\u5148\u8b1b\u6e05\u695a,\u6548\u7387\u5929\u5dee\u5730\u9060\u3002<\/li>\n\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u500b\u300cclient \u5e36 Bearer token\u3001Worker \u5beb R2\u300d\u7684\u7c21\u55ae\u7aef\u9ede,\u537b\u56e0\u70ba Cloudflare \u5100\u8868\u677f\u7684\u7248\u672c\u5feb\u7167\u6a5f\u5236\u9023\u74b0 401\u3002\u5b8c\u6574\u9084\u539f\u9664\u932f\u904e\u7a0b\u3001\u8a3a\u65b7\u6280\u5de7\u3001\u4e09\u7a2e\u89e3\u6cd5,\u4ee5\u53ca\u8981\u8b93 AI \u4ee3\u64cd\u4f5c\u6642\u8a72\u5148\u8b1b\u6e05\u695a\u7684\u4e03\u4ef6\u4e8b\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[923],"tags":[932,929,933,925,930,931],"class_list":["post-862","post","type-post","status-publish","format-standard","hentry","category-workers","tag-ai-","tag-cloudflare-workers","tag-curl","tag-r2","tag-secrets","tag-931"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=862"}],"version-history":[{"count":0,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/862\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}