惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

阿猪的博客

如何使用CNB构建Hexo项目并部署到腾讯云COS 好坑爹!派息后买入的股票怎么也扣股息税? 游哈尔滨 跨年往事 安装Ta-Lib时报错"Could not build wheels" 网站被恶意镜像了该怎么办 延迟退休正式到来!来看看有什么规定 我的基金怎么就被强制卖出了? Hexo-AlgoliaSearch插件报错“Error has occurred during indexing posts” 找工作避坑不完全指南 办理信用卡应该注意什么 华为Pad开启了“共享至电脑”,但是Windows下无法正常访问 webdriver-manager报错一例 Windows无法从环境变量中找到Python的正确位置 习大大2024年新年贺词 号外!号外!Twikoo可以直接屏蔽垃圾评论啦! 如何将Coding的代码仓同步到Github 博客被攻击了 华为Pad开启了“共享至电脑”,但是Ubuntu下无法正常访问 如何恢复Etcher刻录过的U盘 如何在Ubuntu下快速切换网络代理状态 在腾讯云函数中使用Pandas报错`No module named 'numpy.core._multiarray_umath'` 对空的DataFrame使用apply方法未得到预期结果 SQLite中使用关键字作为列名称导致报错 Logging模块重复输出内容的原因及解决方法 如何在Selenium中保持网站的登录状态 如何下载与Chrome浏览器的版本相匹配的ChromeDriver 如何下载旧版本Python的安装包 如何为不同的Python项目自动选择不同的解释器 使用腾讯云函数搭建Web站点 踩坑阿里云函数计算搭建WordPress 在AWS Amplify中部署Jekyll站点 让Chirpy主题支持折叠展示代码块 实现ChatGPT的文字输出效果 python中使用'''注释代码后引起报错 使用python自带的email模块解析邮件 使用pandas_bokeh在地图上显示数据 如何通过复权因子计算复权价格 国内量化平台不完全汇总
WordPress CORS问题一例
阿猪 · 2023-05-22 · via 阿猪的博客

  本文记录阿猪在使用WordPress REST API为跨站应用做身份认证时遇到的一例CORS问题。经过一番折腾,最后发现问题出在使用的REST API Authentication插件在处理HTTP请求时与WordPress原生的REST API有重复。

  在WordPress的原生REST API中,支持Cookie Authentication和Basic Authentication两种认证方式。然而目前比较主流的认证方式是Json Web Token(简称JWT)和OAuth2.0,需要借助第三方插件实现。以JWT为例,基本逻辑是使用POST方式向生成token的endpoint发送用户名和密码,如果用户名、密码正确,则返回的Headers中会包含token信息,后续使用REST API时,只要每次在Header中包含Authorization: Bearer <json-web-token>就可以了。

  阿猪最先使用的是miniOrange出品的WordPress REST API Authentication插件。在WordPress中和在本地测试请求生成token都正常,但是在跨站应用中测试时,浏览器的控制台却报错:Access to fetch at 'https://yfzhu.cn/wp-json/api/v1/token-validate' from origin 'https://xxx.yfzhu.cn' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

  CORS policy是什么鬼?出于安全考虑,浏览器默认会执行同源策略(Same-origin policy),只有同源(URI、主机名、端口相同)的两个页面才被允许相互访问资源。但是在WEB应用中,跨站访问资源是很常见的需求,这就涉及到“跨源资源分享”(Cross-Origin Resource Sharing)的问题。

  经过百度和ChatGPT的一通搜索,大部分的回答是说Nginx的配置不正确,没有开启Access-Control-Allow-Origin这个Header。按照ChatGPT的指导在Nginx的配置文件中添加了相应的Header信息的配置后,可以正常生成token了。以下代码供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
...
server {
...
location / {
...
add_header 'Access-Control-Allow-Origin' 'https://xxx.yfzhu.cn';//将url替换为*表示允许所有访问源
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
...
}
...
}
...
}

  这里顺便说一下,如果你和阿猪一样使用的是OneinStack的LNMP+WordPress全家桶,那么Nginx的配置文件位置是在/usr/local/nginx/conf/vhost/wordpress.conf,而不是在/usr/local/nginx/conf/nginx.conf

  但是还没高兴多久,很快又产生了新的问题。阿猪使用生成的jwt通过GET方式向WordPress REST API请求登录用户信息的时候,浏览器的控制台出现如下错误信息:
Access to fetch at 'https://yfzhu.cn/wp-json/wp/v2/users/me' from origin 'https://xxx.yfzhu.cn' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'https://xxx.yfzhu.cn, https://xxx.yfzhu.cn', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

  再次经过百度和ChatGPT的一通搜索,大部分的回答是说Nginx的配置不正确,有重复的`Access-Control-Allow-Origin`配置。但是阿猪翻遍了Nginx目录下的所有conf文件,也没有找到重复的`Access-Control-Allow-Origin`配置。如果把仅有的`Access-Control-Allow-Origin`配置删除,则又会回到最初的` No 'Access-Control-Allow-Origin' header is present on the requested resource`问题。阿猪又尝试了各种搜索到的办法,但是仍然没有解决。

  后来阿猪想,会不会是WordPress的程序中也有响应Headers信息的语句,从而导致了这个问题。毕竟先前验证token的时候使用的也是GET方法,响应是正常的,没有道理同样是GET请求,服务器区别对待。再仔细对比两个endpoint的路径,一个是第三方插件生成的/wp-json/api/v1/token-validate,一个是WordPress原生的/wp-json/wp/v2/users/me。可能是第三方插件和WordPress都在同一个HTTP请求中输出了headers信息,从而导致了重复。搜索了一下WordPress的代码,果然有几个文件中包含Access-Control-Allow-Origin

  阿猪首先尝试更换JWT插件,毕竟如果换个插件能解决,就可以省去改代码的麻烦了。这次阿猪运气好,换了Enrique Chavez的JWT Authentication for WP-API插件后,问题解决了。如果你也正在被这个问题困扰,希望这篇文章能帮助到你。