谷歌云数据存储401代码

时间:2017-07-16 00:39:51

标签: angular google-cloud-datastore

我想使用Google云数据存储构建一个简单的rest API,但我无法访问我的数据

首先,我是谷歌云的新手,但在我找到解决方案如何使用云数据存储区制作休息API之前,这不会阻止我。

我使用Angular 4作为前端,我想做一个简单的HTTP请求。

这是我在云数据存储区中的数据

enter image description here

这是我的api.service.ts

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/map';




@Injectable()
export class ApiService {

  private apiUrl1 = 'https://jsonplaceholder.typicode.com/posts';
  private apiUrl2= 'https://datastore.googleapis.com/v1/projects/project-test:runQuery?key=dsdsdsdsdsdsdsdsdsdsdsds';

  data: any = {};

  constructor(
    private http: Http
  ) { }

  getData1() {
    return this.http.get(this.apiUrl1)
    .map((res: Response) => res.json());  <====== this works
  }

  getData2() {
    const body = {
      "query": {}
    };

    return this.http.post(this.apiUrl2, body)
    .map((res: Response) => res.json()); <====== this dont works
  }

}

我有这个错误

  

POST   https://datastore.googleapis.com/v1/projects/project-test:runQuery?key=1b169abfa8b87ewewqewewqewqewqewqewqe   401()

请一位专家告诉我是否可以使用rest API访问Google云数据存储区 如果是,为什么我有错误401以及为什么我需要OAuth2

  

“message”:“请求缺少必需的身份验证凭据。   预期的OAuth 2访问令牌,登录cookie或其他有效   身份验证凭据。看到   https://developers.google.com/identity/sign-in/web/devconsole-project“。,↵   “status”:“UNAUTHENTICATED”↵}↵}↵“

用户如何访问我的数据。一些数据将公开发布

如何使用rest API访问云数据存储区的任何示例都将对我们有所帮助。 我在整个互联网上搜索什么都没有。 0 Youtube视频 所有文件都是App引擎。我使用Firebase托管 - 角度4和我想要云数据存储的查询

1 个答案:

答案 0 :(得分:1)

TL; DR - API密钥不适用于Cloud Datastore API。您应该使用来自用户凭据或服务帐户的OAuth 2.0访问令牌。

API key limitations

基于API key documentation for Cloud APIs,只有以下4个云服务支持API密钥,而云数据存储区不是其中之一。它们通常仅用于不需要访问私有用户数据的API。

Google Cloud Platform supported authentication mechanism

除API密钥外,GCP还支持使用用户帐户凭据和服务帐户进行身份验证。它们是explained in detail here

Using OAuth 2.0 to invoke Google APIs

拥有用户帐户凭据或服务帐户凭据后,使用OAuth 2.0您需要获取访问令牌。 process is described herethese steps specific to javascript。我确实找到google-auth library for Node.js,我觉得这对你的用例最有帮助。

该页面中的示例再次提到API密钥(这对您的用例不起作用),我找不到任何使用服务帐户的Angular特定示例。如果您正在使用Node.js,则有Application Default Credentials在使用服务帐户时负责所有身份验证。该库还支持https://regex101.com/r/aZYgvC/1

传递OAuth 2.0凭据

获得OAuth 2.0访问令牌(也称为承载令牌)后,您可以使用Cloud Datastore API请求中的以下3个查询参数之一传递它:

  • access_token
  • oauth_token
  • bearer_token

使用命令行的示例

echo '{gqlQuery: {queryString: "SELECT * FROM Task"}}' | http POST https://datastore.googleapis.com/v1/projects/PROJECT_NAME:runQuery?bearer_token=YOUR_OAUTH_TOKEN

如果您安装了gcloud,则可以使用以下方式获取当前访问令牌:

# Prints the access token
gcloud auth print-access-token
# Use the access token to send the request
echo '{gqlQuery: {queryString: "SELECT * FROM Task"}}' | http POST https://datastore.googleapis.com/v1/projects/PROJECT_NAME:runQuery?bearer_token=$(gcloud auth print-access-token)