{"id":684,"date":"2012-11-04T15:19:00","date_gmt":"2012-11-04T07:19:00","guid":{"rendered":"http:\/\/note.systw.net\/note\/?p=684"},"modified":"2023-11-04T15:29:37","modified_gmt":"2023-11-04T07:29:37","slug":"shibboleth-idp","status":"publish","type":"post","link":"https:\/\/systw.net\/note\/archives\/684","title":{"rendered":"shibboleth IDP"},"content":{"rendered":"\n<p>shibboleth\u53ef\u7528\u4f86\u5efa\u7f6eWEB\u55ae\u4e00\u7c3d\u5165\uff0c\u900f\u904eIDP(identify provider)\u8fa8\u8b58\u5f9eSP(service provider)\u4f86\u7684\u4f7f\u7528\u8005\u3000&nbsp;<br>\u5efa\u7f6e\u7bc4\u4f8b\u53c3\u8003<br>https:\/\/spaces.internet2.edu\/display\/ShibInstallFest\/Shibboleth+Workshop+Series+-+Linux+Identity+Provider+%28Centos+6.2%29<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u5b89\u88dd&nbsp;<\/strong><\/h2>\n\n\n\n<p><br>ps:\u5b89\u88ddidp\u4e4b\u524d\u8acb\u78ba\u5b9a\u53ef\u4ee5\u57f7\u884cjava<br>ps:centos\u548credhat\u9700\u7528openjdk\u5b89\u88dd\u8207\u57f7\u884cidp,\u900f\u904eyum makecache &amp;&amp; yum search openjdk\u53ef\u627e\u5230\u53ef\u7528\u7684\u7248\u672c<br>ps:\u5b89\u88ddIDP\u53c3\u8003\u6587\u737b\u3000https:\/\/wiki.shibboleth.net\/confluence\/display\/SHIB2\/IdPInstall<\/p>\n\n\n\n<p>1<br><strong>\u4e0b\u8f09<\/strong><br>Identity Provider software package\u4e0b\u8f09\u9ede\u5982\u4e0b<br>http:\/\/www.shibboleth.net\/downloads\/identity-provider\/<br>ex:<br>curl -O http:\/\/shibboleth.net\/downloads\/identity-provider\/latest\/shibboleth-identityprovider-2.3.0-bin.zip<\/p>\n\n\n\n<p>2<br><strong>\u5b89\u88dd<\/strong><br>#unzip shibboleth-identityprovider-2.2.0-bin.zip<br>#shibboleth-identityprovider-2.2.0\/install.sh<br>\u6703\u554f3\u500b\u554f\u984c<br>Where should the Shibboleth Identity Provider software be installed? [\/opt\/shibboleth-idp]<br>ps:\u8a72\u4f4d\u7f6e\u6307\u7684\u662fIDP_HOME<br>What is the fully qualified hostname of the Shibboleth Identity Provider server? [idp1.example.org]<br>ps:\u6307\u5b9afully qualified hostname<br>A keystore is about to be generated for you. Please enter a password that will be used to protect it<br>\u8f38\u5165\u81ea\u8a02\u7684\u5bc6\u78bc(\u5f85\u6703\u5728tomcat\u7684server.xml\u6a94\u4e2dkeystorePass\u6703\u7528\u5230)<\/p>\n\n\n\n<p>\u5b89\u88dd\u904e\u7a0bresult\u5982\u4e0b<br>Updating property file: \/root\/shibboleth-identityprovider-2.3.0\/src\/installer\/resources\/install.proper ties<br>Created dir: \/opt\/shibboleth-idp<br>Created dir: \/opt\/shibboleth-idp\/bin<br>Created dir: \/opt\/shibboleth-idp\/conf<br>Created dir: \/opt\/shibboleth-idp\/credentials<br>Created dir: \/opt\/shibboleth-idp\/lib<br>Created dir: \/opt\/shibboleth-idp\/lib\/endorsed<br>Created dir: \/opt\/shibboleth-idp\/logs<br>Created dir: \/opt\/shibboleth-idp\/metadata<br>Created dir: \/opt\/shibboleth-idp\/war<br>Generating signing and encryption key, certificate, and keystore.<br>Copying 5 files to \/opt\/shibboleth-idp\/bin<br>Copying 8 files to \/opt\/shibboleth-idp\/conf<br>Copying 1 file to \/opt\/shibboleth-idp\/metadata<br>Copying 51 files to \/opt\/shibboleth-idp\/lib<br>Copying 5 files to \/opt\/shibboleth-idp\/lib\/endorsed<br>Copying 1 file to \/root\/shibboleth-identityprovider-2.2.0\/src\/installer<br>Building war: \/root\/shibboleth-identityprovider-2.2.0\/src\/installer\/idp.war<br>Copying 1 file to \/opt\/shibboleth-idp\/war<br>Deleting: \/root\/shibboleth-identityprovider-2.2.0\/src\/installer\/web.xml<br>Deleting: \/root\/shibboleth-identityprovider-2.2.0\/src\/installer\/idp.war<\/p>\n\n\n\n<p>BUILD SUCCESSFUL<br>Total time: 1 minute 5 seconds<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;.<\/p>\n\n\n\n<p><strong>Preparing Apache Tomcat for the Shibboleth Identity Provider<\/strong><br>(refer https:\/\/wiki.shibboleth.net\/confluence\/display\/SHIB2\/IdPApacheTomcatPrepare)<br>ps:centos\u548credhat\u9700\u7528openjdk\u57f7\u884ctomcat<br>ps:Apache Tomcat 6.0.17 or greater<br>ps:\u5efa\u8b70\u5728TOMCAT_HOME\/bin\/catalina.sh\u5167\u52a0 -Xmx512M -XX:MaxPermSize=128m<\/p>\n\n\n\n<p>3<br><strong>copy endorsed<\/strong><br>#cp -rf $IDP_HOME\/lib\/endorsed $CATALINA_HOME\/endorsed<br>or<br>#cp \/root\/shibboleth-identityprovider-2.3.0\/endorsed\/*.jar $CATALINA_HOME\/endorsed<br>ps<br>Endorsed libraries<br>Endorse Xerces and Xalan by creating the directory TOMCAT_HOME\/endorsed and copy the .jar files included in the IdP source endorsed directory into the newly created directory.<br>ps:<br>shibboleth\u8981\u6c42tomcat\u555f\u52d5\u6642\u9700\u5305\u542b\u8a72\u53c3\u6578 -Djava.endorsed.dirs=$CATALINA_HOME\/endorsed<br>$CATALINA_HOME\u662f\u6307TOMCAT\u7684\u5b89\u88dd\u76ee\u9304<\/p>\n\n\n\n<p>4<br><strong>Supporting SOAP Endpoints<\/strong><br>4.1<br>Download tomcat6-dta-ssl-1.0.0.jar (asc) in to TOMCAT_HOME\/lib\/.<br>#curl -o \/usr\/share\/tomcat6\/lib\/tomcat6-dta-ssl-1.0.0.jar http:\/\/shibboleth.internet2.edu\/downloads\/maven2\/edu\/internet2\/middleware\/security\/tomcat6\/tomcat6-dta-ssl\/1.0.0\/tomcat6-dta-ssl-1.0.0.jar<br>4.2<br>Configure Tomcat for endpoints on on both ports 443 and 8443<br>ps:443\u7528\u65bcuser agent,8443\u7528\u65bcsp<br>#vi TOMCAT_HOME\/conf\/server.xml file:<br>&lt; Connector port=&#8221;443&#8243;<br>\u3000protocol=&#8221;HTTP\/1.1&#8243;<br>\u3000SSLEnabled=&#8221;true&#8221;<br>\u3000maxThreads=&#8221;150&#8243;<br>\u3000scheme=&#8221;https&#8221;<br>\u3000secure=&#8221;true&#8221;<br>\u3000clientAuth=&#8221;false&#8221;<br>\u3000sslProtocol=&#8221;TLS&#8221;<br><strong>\u3000keystoreFile=&#8221;IDP_HOME\/credentials\/idp.jks&#8221;<br>\u3000keystorePass=&#8221;YourSecretPassword&#8221;<\/strong><br>\/&gt;<br>&lt; Connector port=&#8221;8443&#8243;<br>\u3000protocol=&#8221;org.apache.coyote.http11.Http11Protocol&#8221;<br>\u3000SSLImplementation=&#8221;edu.internet2.middleware.security.tomcat6.DelegateToApplicationJSSEImplementation&#8221;<br>\u3000scheme=&#8221;https&#8221;<br>\u3000SSLEnabled=&#8221;true&#8221;<br>\u3000clientAuth=&#8221;true&#8221;<br><strong>\u3000keystoreFile=&#8221;IDP_HOME\/credentials\/idp.jks&#8221;<br>\u3000keystorePass=&#8221;PASSWORD&#8221;<\/strong><br>\/&gt;<br>ps:<br>IDP_HOME\u8acb\u66f4\u6539\u6210shibboleth\u5b89\u88dd\u76ee\u9304,\u4e5f\u5c31\u662f$IDP_HOME<br>keystoreFile\u8acb\u6307\u5b9ajks\u7684\u4f4d\u7f6e<br>keystorePass\u8acb\u66f4\u6539\u6210\u5b89\u88ddidp\u6642\u7684\u5bc6\u78bc<br>ps<br>\u91cd\u65b0\u555f\u52d5tomcat,\u4e26\u89c0\u67e5443\u548c8443\u662f\u5426\u6709listen<br>#netstat -atunlp | grep LISTEN | grep 443<br>tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN<br>tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN<\/p>\n\n\n\n<p>5<br><strong>\u8a2d\u5b9atomcat\u57f7\u884cidp\u65b9\u5f0f<\/strong><br>\u6709\u4ee5\u4e0b2\u65b9\u6cd5<\/p>\n\n\n\n<p>\u65b9\u6cd51<br>Using a Context Deployment Fragment<br>Create the file TOMCAT_HOME\/conf\/Catalina\/localhost\/idp.xml<br>#vi $CATALINA_HOME\/conf\/Catalina\/localhost\/idp.xml<br>&lt; Context docBase=&#8221;IDP_HOME\/war\/idp.war&#8221;<br>\u3000privileged=&#8221;true&#8221;<br>\u3000antiResourceLocking=&#8221;false&#8221;<br>\u3000antiJARLocking=&#8221;false&#8221;<br>\u3000unpackWAR=&#8221;false&#8221;<br>\u3000swallowOutput=&#8221;true&#8221;<br>\/&gt;<br>ps:IDP_HOME\u8acb\u66f4\u6539\u6210shibboleth\u5b89\u88dd\u76ee\u9304,\u4e5f\u5c31\u662f$IDP_HOME<\/p>\n\n\n\n<p>\u65b9\u6cd52<br>\u5c07idp.war\u8907\u88fd\u5230$CATALINA_HOME\/webapps\/idp\u4e0b<br>\u57f7\u884cjar -xvf idp.war<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<\/p>\n\n\n\n<p><strong>\u91cd\u555ftomcat\u4e26\u6e2c\u8a66<\/strong><br>ps:\u555f\u52d5tomcat\u6642\u7684\u932f\u8aa4\u6703\u8a18\u9304\u5728\/opt\/tomcat\/logs\/catalina.out<\/p>\n\n\n\n<p>7<br><strong>Quick Test<\/strong><br>https:\/\/127.0.0.1\/idp\/profile\/Status<br>If everything is working correctly you should receive an &#8220;ok&#8221; page<\/p>\n\n\n\n<p>8<br><strong>\u672c\u6a5f\u6e2c\u8a66<\/strong><br>\u82e5\u5728\u672c\u6a5f\u53ef\u4e0b https:\/\/127.0.0.1\/idp\/status<br>\u6703\u51fa\u73fe\u72c0\u614b\u8cc7\u8a0a<\/p>\n\n\n\n<p>\u76f8\u95dc\u8cc7\u8a0a\u53ef\u53c3\u8003<br>https:\/\/wiki.shibboleth.net\/confluence\/display\/SHIB2\/IdPStatus<\/p>\n\n\n\n<p>#######################################################################<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u8a2d\u5b9a<\/strong>&nbsp;<\/h2>\n\n\n\n<p>\u8a2d\u5b9aIDP(refer&nbsp;https:\/\/wiki.shibboleth.net\/confluence\/display\/SHIB2\/IdPUserAuthn)<\/p>\n\n\n\n<p><strong>\u4f7f\u7528jaas\u8a2d\u5b9a\u8a8d\u8b49<\/strong><br>1<br><strong>\u7de8\u8f2fhandler.xml\u4ee5\u8a2d\u5b9a\u767b\u5165\u65b9\u5f0f<\/strong><br>1.1<br>\u5b9a\u7fa9LoginHandler\u7684xsi:type\u70ba&#8221;UsernamePassword&#8221;<br>1.2<br>\u5b9a\u7fa9\u8a72\u5143\u7d20\u4e4b\u5fc5\u8a2d\u53c3\u6578 jaasConfigurationLocation<br>1.3<br>(\u9078\u64c7\u6027)\u5176\u4ed6\u984d\u5916\u7684\u53c3\u6578<br>authenticationDuration<br>authenticationServletURL<br><strong>\u505a\u6cd5\u5927\u81f4\u5982\u4e0b<\/strong><br>$vi $IDP_HOME\/conf\/handler.xml<br>&lt; !&#8211; Username\/password login handler &#8211;&gt;<br>&lt; ph:LoginHandler&nbsp;<strong>xsi:type=&#8221;ph:UsernamePassword&#8221;<\/strong><br><strong>jaasConfigurationLocation=&#8221;file:\/\/\/opt\/shibboleth-idp\/conf\/login.config&#8221;<\/strong>&gt;<br>&nbsp;&lt; ph:AuthenticationMethod&gt;<br>&nbsp;urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport<br>&nbsp;&lt; \/ph:AuthenticationMethod&gt;<br>&lt; \/ph:LoginHandler&gt;<br>ps:\u8a2d\u5b9a\u6642,\u5efa\u8b70loginhandler\u50c5\u7559\u4e00\u500b\u5728\u7528\u7684\u548cPrevious Session,\u5176\u4ed6\u7684\u90fd\u8981\u8a3b\u89e3\u6389,\u4ee5\u514d\u767b\u5165\u6642\u51fa\u554f\u984c<br>ps:Previous Session\u7528\u4f86\u8b93\u4e4b\u524d\u5df2\u8a8d\u8b49\u7684user\u5230\u4e0d\u540csp\u6642\u4e0d\u7528\u5728\u53e6\u5916\u8a8d\u8b49<\/p>\n\n\n\n<p><br>2<br><strong>\u7de8\u8f2flogin.conf\u4ee5\u8a2d\u5b9aldap<\/strong><br>\u505a\u6cd5\u5982\u4e0b<br>#vi $IDP_HOME\/conf\/login.config<br>ShibUserPassAuth {<br>\u3000edu.vt.middleware.ldap.jaas.LdapLoginModule required<br>\u3000\u3000ldapUrl=&#8221;ldap:\/\/ldaphost:389&#8243;<br>\u3000\u3000baseDn=&#8221;ou=people,dc=example,dc=org&#8221;<br>\u3000\u3000subtreeSearch=&#8221;true&#8221;<br>\u3000\u3000userField=&#8221;uid&#8221;<br>\u3000\u3000userFilter=&#8221;uid={0}&#8221;;<br>};<\/p>\n\n\n\n<p>3(optional)<br>3.1<br><strong>\u7de8\u8f2fattribute-resolver.xml\u4ee5\u8a2d\u5b9a\u8981\u6293\u53d6\u7684\u5c6c\u6027<\/strong><br>\u65b0\u589e\u539f\u59cb\u5c6c\u6027\u9023\u63a5ldap\u8cc7\u6599,\u4e26\u8a2d\u5b9a\u9023\u63a5id\u70bamyldap<br>#vi $IDP_HOME\/conf\/attribute-resolver.xml<br><strong>&lt; !&#8211; part1 define &#8211;&gt;<\/strong><br>&lt; resolver:<strong>AttributeDefinition id=&#8221;principal&#8221;<\/strong>&nbsp;xsi:type=&#8221;PrincipalName&#8221;<br>\u3000xmlns=&#8221;urn:mace:shibboleth:2.0:resolver:ad&#8221;&gt;<br>\u3000\u3000&lt; resolver:<strong>Dependency ref=&#8221;myldap&#8221;<\/strong>&nbsp;\/&gt;<br>\u3000\u3000&lt; resolver:AttributeEncoder<br>\u3000\u3000\u3000xsi:type=&#8221;SAML2StringNameID&#8221;<br>\u3000\u3000\u3000xmlns=&#8221;urn:mace:shibboleth:2.0:attribute:encoder&#8221;<br>\u3000\u3000\u3000<strong>nameFormat=&#8221;urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified&#8221;<\/strong><br>\u3000\u3000\/&gt;<br>&lt; \/resolver:AttributeDefinition&gt;<br><strong>&lt; !&#8211; part2 data connectors &#8211;&gt;<\/strong><br>&lt; resolver:<strong>DataConnector id=&#8221;myldap&#8221;<\/strong>&nbsp;xsi:type=&#8221;dc:LDAPDirectory&#8221;<br>\u3000ldapURL=&#8221;ldap:\/\/ldap.example.org&#8221;<br>\u3000baseDN=&#8221;ou=people,dc=example,dc=org&#8221;<br>\u3000principal=&#8221;uid=myservice,ou=system&#8221;<br>\u3000principalCredential=&#8221;myServicePassword&#8221;&gt;<br>\u3000&lt; dc:FilterTemplate&gt;<br>\u3000\u3000&lt; ![CDATA[<br>\u3000\u3000\u3000(uid=$requestContext.principalName)<br>\u3000\u3000]]&gt;<br>\u3000&lt; \/dc:FilterTemplate&gt;<br>&lt; \/resolver:DataConnector&gt;<br>\u8aaa\u660e\u5982\u4e0b<br>AttributeDefinition id \u7528\u65bc\u5b58\u53d6\u6b0a\u9650\u7684\u7ba1\u63a7,\u8981\u65bcattribute-filter.xml\u5167\u7684id\u4e00\u81f4<br>nameFormat \u5c6c\u6027\u7684\u683c\u5f0f,sp\u9700\u65bc\u8a72\u683c\u5f0f\u76f8\u540c\u624d\u53ef\u89e3\u6790<br>DataConnector id \u7528\u65bc\u8cc7\u6599\u9023\u63a5\u7528\u7684\u552f\u4e00\u7de8\u865f,\u8981\u548cresolver:Dependency\u7684ref\u4e00\u81f4<br>ldapURL ldap\u4e3b\u6a5f\u7684\u4f4d\u7f6e<br>baseDN \u8a2d\u5b9a\u7bc4basedn<br>principal \u7528\u65bc\u641c\u5c0buser\u7528\u7684dn<br>principalCredential principal\u6240\u6307\u5b9adn\u7684\u5bc6\u78bc<br>&nbsp;<br>3.2<br>\u7de8\u8f2fattribute-policy.xml\u4ee5\u8a2d\u5b9a\u5c6c\u6027\u7684\u5b58\u53d6\u63a7\u5236<br>#vi $IDP_HOME\/conf\/attribute-filter.xml<br>&lt; afp:AttributeFilterPolicy&gt;<br>\u3000&lt; afp:PolicyRequirementRule xsi:type=&#8221;basic:ANY&#8221; \/&gt;<br>\u3000\u3000&lt; afp:AttributeRule<strong>&nbsp;attributeID=&#8221;principal&#8221;<\/strong>&gt;<br>\u3000\u3000&lt; afp:PermitValueRule xsi:type=&#8221;basic:ANY&#8221; \/&gt;<br>\u3000&lt; \/afp:AttributeRule&gt;<br>&lt; \/afp:AttributeFilterPolicy&gt;<br>\u8aaa\u660e\u5982\u4e0b<br>attributeID \u63a7\u5236attribute-resolver.xml\u5167AttributeDefinition id\u7684\u5b58\u53d6\u6b0a\u9650<br>&nbsp;<\/p>\n\n\n\n<p>4<br><strong>\u57fa\u672cIDP\u8a2d\u5b9a\u5b8c\u6210<\/strong><br>\u53ef\u4f7f\u7528\u4ee5\u4e0b\u53c3\u6578\u8a2d\u5b9aSP\u90e8\u4efd<br>idp entity id= https:\/\/&lt; yourdomain&gt;\/idp\/shibboleth<br>resolver:Dependency ref=&#8221;myldap&#8221; (attribute-resolver.xml)<\/p>\n\n\n\n<p>\u767b\u5165\u4f4d\u7f6e<br>https:\/\/&lt; yourdomain&gt;\/idp\/profile\/SAML2\/Redirect\/SSO.<\/p>\n\n\n\n<p><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<\/p>\n\n\n\n<p><strong>\u5ba2\u5236\u5316login.jsp<\/strong><br>ps:login.jsp\u5728idp.war\u5167<br>\u53d6\u5f97\u76f8\u95dc\u8b8a\u6578\u503c\u9700\u4f7f\u7528<br>ex:&lt;%=request.getAttribute(&#8220;actionUrl&#8221;)%&gt;<br>username\u8f38\u5165\u6b04\u4f4d\u7684\u540d\u7a31\u4e00\u5b9a\u8981\u7528j_username<br>ex:&lt; input name=&#8221;j_username&#8221; type=&#8221;text&#8221; tabindex=&#8221;1&#8243; \/&gt;<br>password\u8f38\u5165\u6b04\u4f4d\u7684\u540d\u7a31\u4e00\u5b9a\u8981\u7528j_password<br>ex:&lt; input name=&#8221;j_password&#8221; type=&#8221;password&#8221; tabindex=&#8221;2&#8243; \/&gt;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>shibboleth\u53ef\u7528\u4f86\u5efa\u7f6eWEB\u55ae\u4e00\u7c3d\u5165\uff0c\u900f\u904eIDP(i &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[21],"tags":[],"class_list":["post-684","post","type-post","status-publish","format-standard","hentry","category-linuxservice"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/comments?post=684"}],"version-history":[{"count":0,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/684\/revisions"}],"wp:attachment":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/media?parent=684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/categories?post=684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/tags?post=684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}