代码之家  ›  专栏  ›  技术社区  ›  Rafael Marques

google api nodejs客户端api密钥-需要401登录

  •  0
  • Rafael Marques  · 技术社区  · 4 年前

    我正在尝试使用 google-api-nodejs 库来管理google Campaign Manager API中的一些资源。

    我已经确认,我们目前配置了一个GCP项目,并且该项目启用了google Campaign Manager API(底部的屏幕截图)。

    我尝试了几种验证自己的方法(尤其是API密钥、OAuth2和服务帐户凭据)。不过,这个问题将集中在使用API密钥上,因为理论上它是最简单的(对于使用服务帐户凭据所面临的问题,我将提出一个单独的问题)。

    现在 我已经生成了一个API密钥,并将其限制为可以访问Campaign Manager API (这在下面的屏幕截图中可见)。我配置了我的代码 遵循 using-api-key 图书馆回购协议部分( https://github.com/googleapis/google-api-nodejs-client/#using-api-keys ):

    import { assert } from "chai";
    import { google } from "googleapis";
    
    it("can query userProfiles using API Key", async () => {
      try {
        const api_key = "AIza ****";
    
        const df = google.dfareporting({
          version: "v3.5",
          auth: api_key,
        });
    
        const res = await df.userProfiles.list({}); // error thrown on this line
        console.log("res: ", res);
    
        assert(true);
      } catch (e) {
        console.error("error: ", e);
        assert(false);
      }
    });
    

    不幸的是,此代码导致消息出错 Login required :

    {
      "code": 401,
      "errors": [
        {
          "message": "Login Required.",
          "domain": "global",
          "reason": "required",
          "location": "Authorization",
          "locationType": "header"
        }
      ]
    }
    

    值得注意的是:

    • 虽然API密钥似乎配置正确(也就是说,它与Google API中可见的内容相匹配), 在我们的代码中更改API键的值不会改变结果——错误仍然完全相同

    • 此外,改变 auth 属性来自 google.dfareporting userProfiles.list 结果是同样的错误。

      const df = google.dfareporting({
        version: "v3.5",
      });
      
      const res = await df.userProfiles.list({
        auth: api_key, // error thrown on this line
      });
      

    Campaign Manager API is enabled API key is enabled and has access to Campaign Manager

    0 回复  |  直到 4 年前
        1
  •  1
  •   Linda Lawton - DaImTo    4 年前

    如果你查看文档 userProfiles.list

    你会发现它来自美国

    enter image description here

    这意味着,为了访问此方法,您需要获得使用oauth2的用户的授权,该用户具有其中一个作用域。

    Api密钥只允许您访问公共数据,而不是私人用户数据。

    你应该检查一下 Google api node.js client 有关此库的授权信息。

    const {google} = require('googleapis');
    
    const oauth2Client = new google.auth.OAuth2(
      YOUR_CLIENT_ID,
      YOUR_CLIENT_SECRET,
      YOUR_REDIRECT_URL
    );
    
    // generate a url that asks permissions access 
    
    const scopes = ['https://www.googleapis.com/auth/dfareporting'
    ];
    
    const url = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
    
      // If you only need one scope you can pass it as a string
      scope: scopes
    });