You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无效的可能原因

  1. CEF内部对Referrer的传递逻辑限制:对于跨域请求或第三方资源请求,CEF可能没有将通过SetReferrer设置的Referrer信息正确传递到请求头中,导致谷歌API的验证机制无法识别。
  2. 谷歌API验证的特殊逻辑:在你的场景下,谷歌可能需要显式的请求头字段,而非依赖CEF内部的Referrer机制。

正确的处理方案

  1. 统一使用标准请求头字段: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;
    }
}
  1. 验证谷歌云控制台配置:确保API密钥的网站限制配置正确:
    • 选择“网站限制”类型
    • 添加允许的来源为https://ge.mydomain.com/*(星号用于匹配所有子路径)
    • 确认没有其他限制规则与当前设置冲突
  2. 检查请求实际传递情况:通过DevTools查看谷歌API请求的完整头信息,确认Referer字段确实被正确携带,且值与配置的来源完全一致(包括协议、域名,无多余路径或参数)。

内容的提问来源于stack exchange,提问作者Kyudos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:42:45