CEF-Sharp设置Referrer遇Google Maps API授权问题求助
问题:CEF-Sharp设置Referrer后Google Maps API仍被拦截的疑惑
我在基于CEF-Sharp的工具中调用Google Maps APIs,近期收到谷歌“API密钥不安全”的通知,于是打算通过设置Referrer来配置谷歌云控制台的“网站”应用限制。
我编写了自定义请求处理器类:
public class CustomResourceRequestHandler : ResourceRequestHandler { protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { request.SetReferrer("https://ge.mydomain.com/", ReferrerPolicy.Default); var headers = request.Headers; headers["Referrer"] = "https://ge.mydomain.com/"; request.Headers = headers; return CefReturnValue.Continue; } } public class CustomRequestHandler : CefSharp.Handler.RequestHandler { protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling) { return new CustomResourceRequestHandler(); } }
最初我只调用:
request.SetReferrer("https://ge.mydomain.com/", ReferrerPolicy.Default);
通过DevTools能看到请求头中已经有了正确URL的Referer字段,但即使谷歌云控制台已经配置允许该来源,API还是被拦截。只有手动添加拼写为Referrer的请求头后,API才正常工作。
我疑惑这个拼写差异:IRequest的方法名是SetReferrer,但生成的请求头是Referer,这是我的操作错误吗?
解答
拼写差异是正常现象,并非操作错误
SetReferrer方法使用的是英文单词的正确拼写(referrer),但HTTP请求头的标准字段名是Referer——这是历史遗留的拼写错误,当年HTTP规范制定时写错了,之后便一直沿用至今,所以CEF的方法名和实际请求头字段名不一致是正常的,不是你的操作问题。
仅调用SetReferrer无效的可能原因
- CEF内部对Referrer的传递逻辑限制:对于跨域请求或第三方资源请求,CEF可能没有将通过
SetReferrer设置的Referrer信息正确传递到请求头中,导致谷歌API的验证机制无法识别。 - 谷歌API验证的特殊逻辑:在你的场景下,谷歌可能需要显式的请求头字段,而非依赖CEF内部的Referrer机制。
正确的处理方案
- 统一使用标准请求头字段:HTTP标准中只有
Referer(少一个r)是合法字段,建议只设置这个头,去掉手动添加的Referrer(带两个r)字段,避免不必要的混淆:
public class CustomResourceRequestHandler : ResourceRequestHandler { protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { // 显式设置标准的Referer请求头 var headers = request.Headers; headers["Referer"] = "https://ge.mydomain.com/"; request.Headers = headers; // 可选:保留SetReferrer,确保和请求头一致 request.SetReferrer("https://ge.mydomain.com/", ReferrerPolicy.Default); return CefReturnValue.Continue; } }
- 验证谷歌云控制台配置:确保API密钥的网站限制配置正确:
- 选择“网站限制”类型
- 添加允许的来源为
https://ge.mydomain.com/*(星号用于匹配所有子路径) - 确认没有其他限制规则与当前设置冲突
- 检查请求实际传递情况:通过DevTools查看谷歌API请求的完整头信息,确认
Referer字段确实被正确携带,且值与配置的来源完全一致(包括协议、域名,无多余路径或参数)。
内容的提问来源于stack exchange,提问作者Kyudos
相关产品推荐
相关产品推荐

