{"id":38574,"date":"2023-07-23T15:29:44","date_gmt":"2023-04-27T11:33:42","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/"},"modified":"2024-04-30T14:58:11","modified_gmt":"2024-04-30T06:58:11","slug":"%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd"},"content":{"rendered":"<h1>\u6210\u679c<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/1-2.png\" alt=\"a_3.png\" \/><\/div>\n<h2>\u73af\u5883<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">React<\/ul>\n<\/li>\n<\/ul>\n<p>^18.2.0<\/p>\n<p>react-router-dom<\/p>\n<p>^6.9.0<\/p>\n<p>@okta\/okta-react<\/p>\n<p>^6.7.0<\/p>\n<p>@okta\/okta-auth-js<\/p>\n<p>^7.2.0<\/p>\n<p>\u203b\u53ea\u6458\u5f55\u4e3b\u8981\u5185\u5bb9<\/p>\n<h1>\u60f3\u8981\u5438\u5f15\u7684\u8bfb\u8005<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Okta\u306e\u307f\u3067\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u3066\u307f\u305f\u3044\u4eba<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u6b21\u306b\u7d39\u4ecb\u3059\u308b\u300c\u30cf\u30de\u3063\u305f\u30dd\u30a4\u30f3\u30c8\u300d\u306b\u30cf\u30de\u3063\u3066\u3044\u308b\u4eba<\/ul>\n<p>\u5982\u679c\u4f60\u60f3\u8981\u5728Okta+Cognito\u4e0a\u505a\u7c7b\u4f3c\u4e8eReact\u7684\u4e8b\u60c5\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\u3002<\/p>\n<p>&nbsp;<\/p>\n<h1>\u6c89\u8ff7\u4e8e\u7684\u8981\u70b9<\/h1>\n<h2>\u5305\u542b\u5728idToken\u4e2d\u7684\u7528\u6237\u4fe1\u606f\u5f88\u5c11\u7684\u95ee\u9898<\/h2>\n<h3>\u4e8b\u4ef6<\/h3>\n<p>\u6211\u539f\u672c\u671f\u671bOkta\u7528\u6237\u7684\u4e2a\u4eba\u8d44\u6599\u5305\u542b\u4e86\u6240\u6709\u4fe1\u606f\uff0c\u4f46\u4e8b\u5b9e\u8bc1\u660e\u5e76\u975e\u5982\u6b64\u3002<\/p>\n<p>\u6211\u60f3\u83b7\u53d6\u4e0b\u9762\u8fd9\u4e2aOkta\u7528\u6237\u7684\u540d\u5b57\u548c\u59d3\u6c0f\uff0c\u4f46\u662f\u5728idToken\u4e2d\u627e\u4e0d\u5230\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/14-1.png\" alt=\"a_4.png\" \/><\/div>\n<h3>\u89e3\u51b3\u65b9\u6cd5\u53ef\u4ee5\u6709\u5f88\u591a\u79cd\u3002<\/h3>\n<p>\u5728\u7b7e\u5165\u540e\uff0c\u9700\u8981\u8c03\u7528\u4e00\u4e2a\u540d\u4e3a getUserInfo() \u7684\u51fd\u6570\u3002<\/p>\n<h2>\u5f53\u4f7f\u7528Okta API\u65f6\u906d\u9047\u8de8\u57df\u8d44\u6e90\u5171\u4eab\u9519\u8bef\u95ee\u9898\u3002<\/h2>\n<h3>\u73b0\u8c61<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/19-0.png\" alt=\"a_6.png\" \/><\/div>\n<h3>\u89e3\u51b3\u65b9\u6848<\/h3>\n<p>\u5728Okta\u7684\u8bbe\u7f6e\u9875\u9762\u4e2d\uff0c\u627e\u5230&#8221;Security &gt; API &gt; Trusted Origins&#8221;\uff0c\u8fdb\u884cCORS\uff08\u8de8\u6e90\u8d44\u6e90\u5171\u4eab\uff09\u7684\u6388\u6743\u8bbe\u7f6e\u3002<\/p>\n<h2>\u6709\u4e00\u4e2a\u95ee\u9898\u51fa\u73b0\u4e86\u8b66\u544a\uff08\u79fb\u52a8\u7684\u4e1c\u897f\uff09\u3002<\/h2>\n<h3>\u73b0\u8c61<\/h3>\n<blockquote><p>\u68c0\u6d4b\u5230\u4e24\u4e2a\u81ea\u5b9a\u4e49\u7684 restoreOriginalUri \u56de\u8c03\u51fd\u6570\u3002\u6765\u81ea OktaAuth \u914d\u7f6e\u7684\u90a3\u4e00\u4e2a\u5c06\u88ab\u63d0\u4f9b\u7684 restoreOriginalUri \u5c5e\u6027\u6765\u81ea Security \u7ec4\u4ef6\u7684\u8986\u76d6\u3002<\/p><\/blockquote>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/25-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-03-25 14.21.59.png\" \/><\/div>\n<h3>\u5904\u7406\u529e\u6cd5<\/h3>\n<p>&nbsp;<\/p>\n<p>\u539f\u56e0\u662f\u5728React\u7684StrictMode\u4e0b\uff0c\u7ec4\u4ef6\u88ab\u6e32\u67d3\u4e86\u4e24\u6b21\u3002\u6839\u636e\u4e0a\u9762\u7684\u94fe\u63a5\uff0c\u53ef\u4ee5\u5728useEffect\u7684\u6e05\u7406\u51fd\u6570\u4e2d\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406\u3002<\/p>\n<h1>Okta\u7684\u8bbe\u7f6e<\/h1>\n<h2>\u57fa\u672c\u8bbe\u5b9a (j\u012b sh\u00e8<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/31-0.png\" alt=\"o_1.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">[Sign-in method]<\/ul>\n<\/li>\n<\/ul>\n<p>OIDC &#8211; OpenID Connect<\/p>\n<p>[Application type]<\/p>\n<p>Single-Page Application<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/33-0.png\" alt=\"o_2.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">[App integration name]<\/ul>\n<\/li>\n<\/ul>\n<p>My React App\uff08\u203b\u4efb\u610f\u3067OK\uff09<\/p>\n<p>[Grant type]<\/p>\n<p>Authorization Code<\/p>\n<p>[Sign-in redirect URIs]<\/p>\n<p>http:\/\/localhost:3000\/login\/callback<\/p>\n<p>[Sign-out redirect URIs]<\/p>\n<p>http:\/\/localhost:3000<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/35-0.png\" alt=\"o_3.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Base URIs<\/ul>\n<\/li>\n<\/ul>\n<p>\u7a7a\u3067OK<\/p>\n<p>Assignments<\/p>\n<p>Skip group assignment for now<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/37-0.png\" alt=\"o_4.png\" \/><\/div>\n<h2>\u6307\u6d3e\u7528\u6237<\/h2>\n<p>\u5206\u914d\u5177\u6709\u4f7f\u7528\u4e0a\u8ff0\u521b\u5efa\u7684\u4fe1\u53f7\u673a\u5236\u7684Okta\u7528\u6237\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/40-2.png\" alt=\"o_7.png\" \/><\/div>\n<h2>\u8de8\u57df\u8d44\u6e90\u5171\u4eab\u7684\u8bb8\u53ef<\/h2>\n<p>\u6211\u5011\u5c07\u8a2d\u5b9a\u53ef\u4ee5\u8a2a\u554fOkta API\u7684\u57df\u540d\u3002<\/p>\n<p>\u8fd9\u662f\u6211\u5728\u300c\u5165\u5751\u8981\u70b9\u300d\u4e2d\u4ecb\u7ecd\u7684\u5bfc\u81f4\u201c\u5728\u7b7e\u51fa\u65f6\u53d1\u751f\u4e0b\u8ff0\u9519\u8bef\u201d\u95ee\u9898\u7684\u539f\u56e0\u3002<\/p>\n<p>\u5982\u679c\u4e0d\u8fd9\u6837\u505a\uff0c\u5c31\u65e0\u6cd5\u6709\u6548\u5730\u8c03\u7528Okta\u7684API\uff0c\u5e94\u7528\u7a0b\u5e8f\uff08React\u90e8\u5206\uff09\u4f1a\u62a5\u9519\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/45-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-03-26 8.54.37.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/46-0.png\" alt=\"o_10.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">[Origin name]<\/ul>\n<\/li>\n<\/ul>\n<p>localhost:3000<\/p>\n<p>[Origin URL]<\/p>\n<p>http:\/\/localhost:3000<\/p>\n<p>[Choose Type]<\/p>\n<p>\u4e0b\u8a18\uff12\u3064\u3092\u30c1\u30a7\u30c3\u30af<\/p>\n<p>Cross-Origin Resource Sharing(CORS)<br \/>\nRedirect<\/p>\n<p>Okta\u7684\u914d\u7f6e\u5df2\u7ecf\u5b8c\u6210\u3002<\/p>\n<h1>\u521b\u5efaReact\u5e94\u7528<\/h1>\n<p>\u4f7f\u7528create-react-app\u8fdb\u884c\u521b\u5efa\u3002<\/p>\n<p>\u5982\u679c\u60a8\u4f7f\u7528VITE\u6216\u5176\u4ed6\u5de5\u5177\u6765\u521b\u5efa\u7684\u8bdd\uff0c\u7531\u4e8e\u7aef\u53e3\u7684\u53d8\u5316\uff0c\u6240\u4ee5\u8981\u6ce8\u610f\u4e4b\u524d\u5728\u201c\u6dfb\u52a0\u539f\u70b9\u201d\u4e2d\u8bbe\u7f6e\u7684\u56de\u8c03URL\u9700\u8981\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<p>\u5728\u60a8\u81ea\u5df1\u7684\u5de5\u4f5c\u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a React \u9879\u76ee\u3002<\/p>\n<pre class=\"post-pre\"><code>npx create-react-app react-okta-20230326\r\n<\/code><\/pre>\n<h2>\u9644\u52a0\u5e93<\/h2>\n<p>\u6211\u4eec\u5c06\u5728\u4e0a\u8ff0\u521b\u5efa\u7684React\u9879\u76ee\u4e2d\u6dfb\u52a0\u6240\u9700\u7684\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code>yarn add @okta\/okta-react @okta\/okta-auth-js react-router-dom\r\n<\/code><\/pre>\n<h2>\u76ee\u5f55\u7ed3\u6784\u3002<\/h2>\n<p>\u8fd9\u662f\u4e00\u4e2a\u5df2\u5b8c\u5584\u7684\u76ee\u5f55\u7ed3\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 node_modules\/\r\n\u251c\u2500\u2500 package-lock.json\r\n\u251c\u2500\u2500 package.json\r\n\u251c\u2500\u2500 public\r\n\u2502   \u251c\u2500\u2500 favicon.ico\r\n\u2502   \u251c\u2500\u2500 index.html\r\n\u2502   \u251c\u2500\u2500 logo192.png\r\n\u2502   \u251c\u2500\u2500 logo512.png\r\n\u2502   \u251c\u2500\u2500 manifest.json\r\n\u2502   \u2514\u2500\u2500 robots.txt\r\n\u251c\u2500\u2500 src\r\n\u2502   \u251c\u2500\u2500 App.css\r\n\u2502   \u251c\u2500\u2500 App.js\r\n\u2502   \u251c\u2500\u2500 App.test.js\r\n\u2502   \u251c\u2500\u2500 config\r\n\u2502   \u2502   \u2514\u2500\u2500 auth.js\r\n\u2502   \u251c\u2500\u2500 hooks\r\n\u2502   \u2502   \u2514\u2500\u2500 use-auth.js\r\n\u2502   \u251c\u2500\u2500 index.css\r\n\u2502   \u251c\u2500\u2500 index.js\r\n\u2502   \u251c\u2500\u2500 logo.svg\r\n\u2502   \u251c\u2500\u2500 reportWebVitals.js\r\n\u2502   \u2514\u2500\u2500 setupTests.js\r\n\u2514\u2500\u2500 yarn.lock\r\n\r\n<\/code><\/pre>\n<h2>\u5b9e\u65bd<\/h2>\n<p>\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u3002 .)<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u521b\u5efaconfig\/auth.js\u6587\u4ef6<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u521b\u5efahooks\/use-auth.js\u6587\u4ef6<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u7f16\u8f91index.js\u6587\u4ef6<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u7f16\u8f91App.js\u6587\u4ef6<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u7f16\u8f91App.css\u6587\u4ef6<\/ol>\n<h2>\u521b\u5efaconfig\/auth.js<\/h2>\n<h3>\u5ba2\u6237\u8eab\u4efd\u8bc1\u4ef6<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/65-0.png\" alt=\"o_12.png\" \/><\/div>\n<h3>\u5e10\u53f7\u7684\u57df\u540d de<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/67-0.png\" alt=\"o_13.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ \u4f8b\uff090123456789abcdefghij<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">CLIENT_ID<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Client ID<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"c1\">\/\/ \u4f8b\uff09https:\/\/dev-12345678.okta.com\/oauth2\/default<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">ISSUER<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">https:\/\/\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30c9\u30e1\u30a4\u30f3\/oauth2\/default<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">REDIRECT_URI<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin<\/span><span class=\"p\">}<\/span><span class=\"s2\">\/login\/callback`<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c1\">\/\/ eslint-disable-next-line<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">oidc<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">clientId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CLIENT_ID<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">issuer<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ISSUER<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">redirectUri<\/span><span class=\"p\">:<\/span> <span class=\"nx\">REDIRECT_URI<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">scopes<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">openid<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">email<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">profile<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">],<\/span>\r\n    <span class=\"na\">pkce<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<h2>\u8bf7\u521b\u5efahooks\/use-auth.js\u6587\u4ef6\u3002<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createContext<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useContext<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useEffect<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useOktaAuth<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@okta\/okta-react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">OktaAuth<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toRelativeUrl<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@okta\/okta-auth-js<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">config<\/span>  <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/config\/auth<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">oktaAuth<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">OktaAuth<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">oidc<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">authContext<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createContext<\/span><span class=\"p\">({});<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">ProvideAuth<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span><span class=\"nx\">children<\/span><span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">auth<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useProvideAuth<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">authContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">Provider<\/span> <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">auth<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"p\">{<\/span><span class=\"nx\">children<\/span><span class=\"p\">}<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/authContext.Provider<\/span><span class=\"err\">&gt;\r\n<\/span>    <span class=\"p\">)<\/span>\r\n  <span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">useAuth<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"nf\">useContext<\/span><span class=\"p\">(<\/span><span class=\"nx\">authContext<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">useProvideAuth<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">authState<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useOktaAuth<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">isAuthenticated<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setIsAuthenticated<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useState<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">username<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setUserName<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useState<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\u30b2\u30b9\u30c8<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">user<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setUser<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useState<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\r\n\r\n  <span class=\"nf\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">authState<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">authState<\/span><span class=\"p\">.<\/span><span class=\"nx\">isAuthenticated<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">authState<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">oktaAuth<\/span><span class=\"p\">.<\/span><span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nf\">getUserInfo<\/span><span class=\"p\">()<\/span>\r\n      <span class=\"p\">.<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nf\">setUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"nf\">setUserName<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"nf\">setIsAuthenticated<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"p\">});<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">authState<\/span><span class=\"p\">]);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">signIn<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">originalUri<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">toRelativeUrl<\/span><span class=\"p\">(<\/span><span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">href<\/span><span class=\"p\">,<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">oktaAuth<\/span><span class=\"p\">.<\/span><span class=\"nf\">setOriginalUri<\/span><span class=\"p\">(<\/span><span class=\"nx\">originalUri<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">oktaAuth<\/span><span class=\"p\">.<\/span><span class=\"nf\">signInWithRedirect<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">signOut<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">oktaAuth<\/span><span class=\"p\">.<\/span><span class=\"nf\">signOut<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"nf\">setUser<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nf\">setIsAuthenticated<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">isAuthenticated<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">user<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">username<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">signIn<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">signOut<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u91cd\u70b9\u5728\u4e8e\u4f7f\u7528`useProvideAuth`\u7684`useEffect`\uff0c\u901a\u8fc7`oktaAuth.token.getUserInfo()`\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u3002<\/p>\n<p>\u8fd9\u5c06\u6210\u4e3a\u89e3\u51b3\u5728\u300c\u5361\u4f4f\u70b9\u300d\u4e2d\u63d0\u5230\u7684\u300cidToken\u4e2d\u6240\u5305\u542b\u7684\u7528\u6237\u4fe1\u606f\u5f88\u5c11\u7684\u95ee\u9898\u300d\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u5c3d\u7ba1\u5982\u6b64\uff0c\u7531\u4e8eidToken\u4e2d\u5305\u542b\u4e86\u7528\u6237\u540d\u79f0\u3001\u7535\u5b50\u90ae\u4ef6\u7b49\u57fa\u672c\u4fe1\u606f\uff0c\u6240\u4ee5\u5982\u679c\u8fd9\u4e9b\u5c31\u8db3\u591f\u7684\u8bdd\uff0c\u53ef\u4ee5\u76f4\u63a5\u4eceidToken\u4e2d\u83b7\u53d6\uff0c\u65e0\u9700\u8c03\u7528\u4ee5\u4e0a\u51fd\u6570\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/74-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-03-26 9.55.34.png\" \/><\/div>\n<h2>\u7f16\u8f91index.js\u6587\u4ef6<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ReactDOM<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-dom\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/index.css<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">App<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/App<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">reportWebVitals<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/reportWebVitals<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BrowserRouter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">root<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ReactDOM<\/span><span class=\"p\">.<\/span><span class=\"nf\">createRoot<\/span><span class=\"p\">(<\/span><span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nf\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">root<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span>\r\n<span class=\"nx\">root<\/span><span class=\"p\">.<\/span><span class=\"nf\">render<\/span><span class=\"p\">(<\/span>\r\n  <span class=\"o\">&lt;<\/span><span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">StrictMode<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">BrowserRouter<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">App<\/span> <span class=\"o\">\/&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/BrowserRouter<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"o\">&lt;<\/span><span class=\"sr\">\/React.StrictMode<\/span><span class=\"err\">&gt;\r\n<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"c1\">\/\/ If you want to start measuring performance in your app, pass a function<\/span>\r\n<span class=\"c1\">\/\/ to log results (for example: reportWebVitals(console.log))<\/span>\r\n<span class=\"c1\">\/\/ or send to an analytics endpoint. Learn more: https:\/\/bit.ly\/CRA-vitals<\/span>\r\n<span class=\"nf\">reportWebVitals<\/span><span class=\"p\">();<\/span>\r\n<\/code><\/pre>\n<h2>\u7f16\u8f91App.js<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/App.css<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useCallback<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useEffect<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useNavigate<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">toRelativeUrl<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@okta\/okta-auth-js<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Security<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@okta\/okta-react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Routes<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Route<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">LoginCallback<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@okta\/okta-react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useAuth<\/span><span class=\"p\">,<\/span> <span class=\"nx\">oktaAuth<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ProvideAuth<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/hooks\/use-auth<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Profile<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">isAuthenticated<\/span><span class=\"p\">,<\/span> <span class=\"nx\">user<\/span><span class=\"p\">,<\/span> <span class=\"nx\">username<\/span><span class=\"p\">,<\/span> <span class=\"nx\">signIn<\/span><span class=\"p\">,<\/span> <span class=\"nx\">signOut<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useAuth<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">main<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">'<\/span><span class=\"s1\">App<\/span><span class=\"dl\">'<\/span><span class=\"o\">&gt;<\/span>\r\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">\u3088\u3046\u3053\u305d<\/span><span class=\"err\">\u3001<\/span><span class=\"p\">{<\/span> <span class=\"nx\">username<\/span> <span class=\"p\">}<\/span><span class=\"nx\">\u3055\u3093<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/p<\/span><span class=\"err\">&gt;\r\n<\/span>        <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">isAuthenticated<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\r\n            <span class=\"o\">&lt;&gt;<\/span>\r\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">ul<\/span><span class=\"o\">&gt;<\/span>\r\n                <span class=\"p\">{<\/span> \r\n                  <span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nf\">keys<\/span><span class=\"p\">(<\/span><span class=\"nx\">user<\/span><span class=\"p\">)<\/span>\r\n                    <span class=\"p\">.<\/span><span class=\"nf\">filter<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">key<\/span> <span class=\"o\">!==<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">headers<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\r\n                    <span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\r\n                      <span class=\"o\">&lt;<\/span><span class=\"nx\">li<\/span> <span class=\"nx\">key<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span> <span class=\"p\">:<\/span> <span class=\"p\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">[<\/span><span class=\"nx\">key<\/span><span class=\"p\">]}<\/span> <span class=\"o\">&lt;<\/span><span class=\"sr\">\/li<\/span><span class=\"err\">&gt;\r\n<\/span>                    <span class=\"p\">))<\/span>\r\n                <span class=\"p\">}<\/span>\r\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/ul<\/span><span class=\"err\">&gt;\r\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">signOut<\/span><span class=\"p\">()}<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">\u30ed\u30b0\u30a2\u30a2\u30a6\u30c8<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>          <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\r\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">signIn<\/span><span class=\"p\">()}<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">\u30ed\u30b0\u30a4\u30f3<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>          <span class=\"p\">)<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        \r\n      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/main<\/span><span class=\"err\">&gt;\r\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">navigate<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useNavigate<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">restoreOriginalUri<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useCallback<\/span><span class=\"p\">((<\/span><span class=\"nx\">_oktaAuth<\/span><span class=\"p\">,<\/span>  <span class=\"nx\">originalUri<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">navigate<\/span><span class=\"p\">(<\/span><span class=\"nf\">toRelativeUrl<\/span><span class=\"p\">(<\/span><span class=\"nx\">originalUri<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">navigate<\/span><span class=\"p\">])<\/span>\r\n\r\n  <span class=\"nf\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">oktaAuth<\/span><span class=\"p\">.<\/span><span class=\"nx\">options<\/span><span class=\"p\">.<\/span><span class=\"nx\">restoreOriginalUri<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">undefined<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[])<\/span>\r\n\r\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">Security<\/span> <span class=\"nx\">oktaAuth<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">oktaAuth<\/span><span class=\"p\">}<\/span> <span class=\"nx\">restoreOriginalUri<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">restoreOriginalUri<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">ProvideAuth<\/span><span class=\"o\">&gt;<\/span>\r\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">Routes<\/span><span class=\"o\">&gt;<\/span>\r\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">exact<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"kc\">true<\/span><span class=\"p\">}<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Profile<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">login\/callback<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">LoginCallback<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Routes<\/span><span class=\"err\">&gt;\r\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/ProvideAuth<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Security<\/span><span class=\"err\">&gt;\r\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">);<\/span>\r\n\r\n<span class=\"p\">};<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u91cd\u70b9\u662f\u901a\u8fc7 useEffect \u8bbe\u7f6e\u6e05\u7406\u51fd\u6570\u7684\u5730\u65b9\u3002<\/p>\n<p>\u8fd9\u5c06\u6210\u4e3a\u89e3\u51b3\u300c\u67d0\u4e2a\u5438\u5f15\u6211\u7684\u95ee\u9898\uff08\u52a8\u6001\u7684\uff09\u300d\u4e2d\u6240\u63d0\u5230\u7684\u201c\u8b66\u544a\u51fa\u73b0\u201d\u7684\u89e3\u51b3\u65b9\u6cd5\u3002<\/p>\n<h2>\u4fee\u6539 App.css<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nc\">.App<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">background-color<\/span><span class=\"p\">:<\/span> <span class=\"m\">#282c34<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">min-height<\/span><span class=\"p\">:<\/span> <span class=\"m\">100vh<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">display<\/span><span class=\"p\">:<\/span> <span class=\"n\">flex<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">flex-direction<\/span><span class=\"p\">:<\/span> <span class=\"n\">column<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">align-items<\/span><span class=\"p\">:<\/span> <span class=\"nb\">center<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">justify-content<\/span><span class=\"p\">:<\/span> <span class=\"nb\">center<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">font-size<\/span><span class=\"p\">:<\/span> <span class=\"n\">calc<\/span><span class=\"p\">(<\/span><span class=\"m\">10px<\/span> <span class=\"err\">+<\/span> <span class=\"m\">2vmin<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"nl\">color<\/span><span class=\"p\">:<\/span> <span class=\"no\">white<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nt\">button<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">font-size<\/span><span class=\"p\">:<\/span> <span class=\"n\">calc<\/span><span class=\"p\">(<\/span><span class=\"m\">10px<\/span> <span class=\"err\">+<\/span> <span class=\"m\">2vmin<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nt\">p<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">margin-bottom<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nt\">ul<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">list-style<\/span><span class=\"p\">:<\/span> <span class=\"nb\">none<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">font-size<\/span><span class=\"p\">:<\/span> <span class=\"m\">16px<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">border<\/span><span class=\"p\">:<\/span> <span class=\"m\">1px<\/span> <span class=\"nb\">solid<\/span> <span class=\"m\">#fff<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">padding<\/span><span class=\"p\">:<\/span> <span class=\"m\">1em<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">margin<\/span><span class=\"p\">:<\/span> <span class=\"m\">1em<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5c31\u662f\u8fd9\u6837\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/84-0.png\" alt=\"a_1.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/85-0.png\" alt=\"a_3.png\" \/><\/div>\n<h1>\u6700\u540e<\/h1>\n<p>\u89e3\u51b3\u300cidToken\u4e2d\u7528\u6237\u4fe1\u606f\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\u300d\u6709\u4e9b\u56f0\u96be\u3002<\/p>\n<p>\u5728\u4f11\u606f\u65e5\u91cc\u52a8\u624b\u505a\u4e8b\u65f6\uff0c\u4e0d\u77e5\u4e0d\u89c9\u5730\u60f3\u8981\u73a9\u4e50\uff0c\u6ca1\u6709\u601d\u8003\u5730\u5fd9\u788c\u8d77\u6765\uff0c\u7ed3\u679c\u6d6a\u8d39\u4e86\u76f8\u5f53\u591a\u7684\u65f6\u95f4\u3002<\/p>\n<p>\u6211\u5e0c\u671b\u5728\u4f11\u606f\u65e5\u6216\u5de5\u4f5c\u65f6\u95f4\uff0c\u90fd\u80fd\u62e5\u6709\u4e0d\u5077\u61d2\u5730\u9605\u8bfb\u5b98\u65b9\u6587\u4ef6\u7684\u575a\u5f3a\u5fc3\u6001\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6210\u679c \u73af\u5883 React ^18.2.0 react-router-dom ^6.9.0 @okta\/okta- [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-38574","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528okta\u5b9e\u73b0react\u7684\u767b\u5f55\u529f\u80fd\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd\" \/>\n<meta property=\"og:description\" content=\"\u6210\u679c \u73af\u5883 React ^18.2.0 react-router-dom ^6.9.0 @okta\/okta- [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528okta\u5b9e\u73b0react\u7684\u767b\u5f55\u529f\u80fd\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-27T11:33:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T06:58:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/1-2.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/\",\"name\":\"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-04-27T11:33:42+00:00\",\"dateModified\":\"2024-04-30T06:58:11+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528okta\u5b9e\u73b0react\u7684\u767b\u5f55\u529f\u80fd\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd","og_description":"\u6210\u679c \u73af\u5883 React ^18.2.0 react-router-dom ^6.9.0 @okta\/okta- [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528okta\u5b9e\u73b0react\u7684\u767b\u5f55\u529f\u80fd\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-04-27T11:33:42+00:00","article_modified_time":"2024-04-30T06:58:11+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d355837434c4406c6c222\/1-2.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/","name":"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-04-27T11:33:42+00:00","dateModified":"2024-04-30T06:58:11+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Okta\u5b9e\u73b0React\u7684\u767b\u5f55\u529f\u80fd"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8okta%e5%ae%9e%e7%8e%b0react%e7%9a%84%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=38574"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38574\/revisions"}],"predecessor-version":[{"id":92595,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38574\/revisions\/92595"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=38574"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=38574"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=38574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}