亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table of Contents
Understanding the Root Cause of “Permission Denied”: The Limitations of API Keys
Solution: OAuth 2.0 service account authentication
What is a service account?
Access BigQuery using service accounts in Go and GAE
Key considerations
Summarize
Home Backend Development Golang Permission management and best practices for accessing BigQuery on GAE using Go

Permission management and best practices for accessing BigQuery on GAE using Go

Oct 12, 2025 am 07:15 AM

Permission management and best practices for accessing BigQuery on GAE using Go

This article aims to solve the "permission denial" problem encountered by the Go language when accessing BigQuery through API Key in the Google App Engine (GAE) environment. We will deeply analyze the limitations of API Key in this scenario, and elaborate on how to use OAuth 2.0 service account (Service Account) for correct authentication and authorization. We will provide clear Go language code examples and key precautions to ensure that applications can access BigQuery data safely and efficiently.

Understanding the Root Cause of “Permission Denied”: The Limitations of API Keys

In Google Cloud Platform (GCP), API Key is mainly used to identify projects for usage quota management and billing. It is a simple string used to verify which project the request comes from, but it does not have the ability to authorize access to protected resources such as data in BigQuery. When you try to access BigQuery using an API Key, the system returns a "Permission Denied" error due to a lack of valid authentication and authorization credentials, even though the API Key has been correctly generated and associated with the project in the Google API Console.

The KeyedTransport structure you used in your question, although the API Key is appended to the request URL, is only suitable for a few public APIs that do not involve user data or sensitive resource access. For services such as BigQuery that require strict permission control, it requires the requester to provide a clear identity (such as user identity or service identity) and the corresponding permissions granted by this identity.

Solution: OAuth 2.0 service account authentication

To securely access BigQuery from a Google App Engine Go application, the correct authentication mechanism is to use an OAuth 2.0 service account. A service account is a special Google account that represents your application rather than the end user, allowing it to access Google Cloud resources without user intervention. This fits perfectly if you don't want users to Google login.

What is a service account?

The service account is a special identity in the GCP project, which can be granted specific IAM (Identity and Access Management) roles to control its access to GCP resources. When your GAE application makes a request as a service account, GCP will determine whether to allow access based on the role granted to the service account.

Access BigQuery using service accounts in Go and GAE

In the Go language, combined with the Google Cloud official client library, it is very straightforward to use service accounts for authentication. For applications deployed on GAE, Google Cloud SDK provides a convenient way to utilize GAE's default service account.

1. Enable BigQuery API and configure IAM permissions

Before you start writing code, make sure you have the following configuration in your GCP project:

  • Enable BigQuery API: Visit the Google Cloud console, navigate to "APIs and Services" -> "Libraries", search for and enable "BigQuery API".
  • Grant service account permissions:
    • For GAE default service account: GAE applications usually use a default service account in the format of your-project-id@appspot.gserviceaccount.com. You need to grant appropriate roles such as "BigQuery Data Viewer", "BigQuery Data Editor" or "BigQuery User" to this service account so that it can query or operate BigQuery data.
    • For custom service accounts: If you create a custom service account, you need to grant the corresponding BigQuery role to the custom service account.

2. Go language code examples

The following is a Go language code example that demonstrates how to use service account authentication to initialize the BigQuery client and execute queries in a GAE application:

 package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "cloud.google.com/go/bigquery"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
)

// Your GCP Project ID
const projectID = "your-gcp-project-id" // Replace with your GCP project ID
const datasetID = "your_dataset_id" // Replace with your BigQuery dataset ID
const tableID = "your_table_id" // Replace with your BigQuery table ID

func main() {
    ctx := context.Background()

    // Initialize BigQuery client // For applications deployed on GAE, you can usually use DefaultAppEngineTokenSource directly
    // Or, if your application is not on GAE or needs to use a specific service account JSON file,
    // You can use option.WithCredentialsFile("path/to/your/service-account-key.json")
    client, err := bigquery.NewClient(ctx, projectID, option.WithDefaultCredentials())
    if err != nil {
        log.Fatalf("Failed to create BigQuery client: %v", err)
    }
    defer client.Close()

    // Construct query statement query := fmt.Sprintf("SELECT column_name FROM `%s.%s.%s` WHERE unique_id = 'some_value' LIMIT 1",
        projectID, datasetID, tableID)

    q := client.Query(query)
    q.Location = "US" //Specify the data set location, such as "US" or "EU"

    // Execute query it, err := q.Read(ctx)
    if err != nil {
        log.Fatalf("Failed to execute BigQuery query: %v", err)
    }

    // Traverse the query results var row []bigquery.Value
    for {
        err := it.Next(&row)
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to read BigQuery row: %v", err)
        }
        fmt.Printf("Query Result: %v\n", row)
    }

    fmt.Println("BigQuery query executed successfully.")
}

Code analysis:

  • cloud.google.com/go/bigquery : This is the official Go client library for Google Cloud BigQuery.
  • google.golang.org/api/option : This package provides methods to configure client options, including authentication methods.
  • bigquery.NewClient(ctx, projectID, option.WithDefaultCredentials()) :
    • option.WithDefaultCredentials() is the recommended authentication method in Go applications. When an application is deployed in a Google Cloud environment (such as GAE, GCE, Cloud Run, etc.), it automatically finds and uses the default service account credentials provided by the environment.
    • If you are developing locally and want to simulate a GAE environment, or need to use a specific service account, you can download the service account's JSON key file and use option.WithCredentialsFile("path/to/your/service-account-key.json") to specify the credentials. Please note that in a production environment, the service account key file should never be packaged directly into your application image or hard-coded in the code.
  • client.Query(query) : Create a BigQuery query object.
  • q.Read(ctx) : Execute the query and return an iterator.
  • it.Next(&row) : Traverse the query results and parse each row of data into the row variable.

Key considerations

  1. Principle of Minimization of Permissions: Always follow the principle of least permissions and only grant service accounts the minimum permissions required to complete their tasks. For example, if the application only needs to read BigQuery data, grant the "BigQuery Data Viewer" role instead of granting higher permissions such as "BigQuery Data Editor" or "BigQuery Administrator".
  2. Avoid hardcoding credentials: API Keys or service account keys should never be hardcoded in your code. For service accounts, option.WithDefaultCredentials() is the best practice for obtaining credentials in a Google Cloud environment. If you must use a JSON key file, make sure it is provided to the application through a secure means (such as environment variables, Secret Manager, etc.).
  3. Error handling: In actual applications, it is important to implement robust error handling for all operations such as initialization, query execution, and result reading of the BigQuery client.
  4. Dataset location: When executing a BigQuery query, if your dataset has a specific location (such as US, EU), it is recommended to set q.Location on the Query object to avoid potential cross-region data transfer issues or performance impacts.
  5. The difference between OAuth 2.0 and API Key: Again, API Key is used for project identification and quota management, while OAuth 2.0 (including service account) is used for authentication and authorization, and is a necessary means to access protected resources.

Summarize

Through the detailed explanation and code examples of this article, you should already know how to correctly handle permissions when accessing BigQuery in a Google App Engine application in Go language. Abandoning the use of API Key for authorization and switching to OAuth 2.0 service account is the key to solving the "permission denial" problem. By properly configuring IAM permissions and leveraging option.WithDefaultCredentials() of the Google Cloud Go client library, your app will be able to interact with BigQuery securely and efficiently without requiring additional login actions from the user. Follow best practices to ensure the security of your GCP environment and applications.

The above is the detailed content of Permission management and best practices for accessing BigQuery on GAE using Go. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

ArtGPT

ArtGPT

AI image generator for creative art from text prompts.

Stock Market GPT

Stock Market GPT

AI powered investment research for smarter decisions

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

What is the empty struct struct{} used for in Golang What is the empty struct struct{} used for in Golang Sep 18, 2025 am 05:47 AM

struct{} is a fieldless structure in Go, which occupies zero bytes and is often used in scenarios where data is not required. It is used as a signal in the channel, such as goroutine synchronization; 2. Used as a collection of value types of maps to achieve key existence checks in efficient memory; 3. Definable stateless method receivers, suitable for dependency injection or organization functions. This type is widely used to express control flow and clear intentions.

How do you read and write files in Golang? How do you read and write files in Golang? Sep 21, 2025 am 01:59 AM

Goprovidessimpleandefficientfilehandlingusingtheosandbufiopackages.Toreadasmallfileentirely,useos.ReadFile,whichloadsthecontentintomemorysafelyandautomaticallymanagesfileoperations.Forlargefilesorincrementalprocessing,bufio.Scannerallowsline-by-liner

How do you handle graceful shutdowns in a Golang application? How do you handle graceful shutdowns in a Golang application? Sep 21, 2025 am 02:30 AM

GracefulshutdownsinGoapplicationsareessentialforreliability,achievedbyinterceptingOSsignalslikeSIGINTandSIGTERMusingtheos/signalpackagetoinitiateshutdownprocedures,thenstoppingHTTPserversgracefullywithhttp.Server’sShutdown()methodtoallowactiverequest

How to read configuration from files in Golang How to read configuration from files in Golang Sep 18, 2025 am 05:26 AM

Use the encoding/json package of the standard library to read the JSON configuration file; 2. Use the gopkg.in/yaml.v3 library to read the YAML format configuration; 3. Use the os.Getenv or godotenv library to overwrite the file configuration; 4. Use the Viper library to support advanced functions such as multi-format configuration, environment variables, automatic reloading; it is necessary to define the structure to ensure type safety, properly handle file and parsing errors, correctly use the structure tag mapping fields, avoid hard-coded paths, and recommend using environment variables or safe configuration storage in the production environment. It can start with simple JSON and migrate to Viper when the requirements are complex.

What is CGO and when to use it in Golang What is CGO and when to use it in Golang Sep 21, 2025 am 02:55 AM

CGOenablesGotocallCcode,allowingintegrationwithClibrarieslikeOpenSSL,accesstolow-levelsystemAPIs,andperformanceoptimization;itrequiresimporting"C"withCheadersincomments,usesC.function()syntax,anddemandscarefulmemorymanagement.However,CGOinc

How to use sqlc to generate type-safe SQL code in Go How to use sqlc to generate type-safe SQL code in Go Sep 17, 2025 am 12:41 AM

Install the sqlcCLI tool, it is recommended to use curl scripts or Homebrew; 2. Create a project structure, including db/schema.sql (table structure), db/query.sql (annotated query) and sqlc.yaml configuration files; 3. Define database tables in schema.sql; 4. Write SQL queries with --name:annotation and :exec/:one/:many directives in query.sqlc.yaml; 5. Configure sqlc.yaml to specify package paths, query files, schema files, database engines and generation options; 6. Run sqlcgenerate to generate type-safe Go code, including models, query methods and interfaces

Go language strconv package: correct posture for integer to string conversion and the errors of Itoa64 Go language strconv package: correct posture for integer to string conversion and the errors of Itoa64 Sep 21, 2025 am 08:36 AM

This article aims to resolve the "undefined" error encountered in Go when trying to use strconv.Itoa64 for integer-to-string conversion. We will explain why Itoa64 does not exist and give details on the correct alternative to strconv.FormatInt in the strconv package. Through instance code, readers will learn how to efficiently and accurately convert integer types into string representations in specified partitions, avoid common programming traps and improve code robustness and readability.

How to create a custom marshaller/unmarshaller for JSON in Golang How to create a custom marshaller/unmarshaller for JSON in Golang Sep 19, 2025 am 12:01 AM

Implements JSON serialization and deserialization of customizable Go structures for MarshalJSON and UnmarshalJSON, suitable for handling non-standard formats or compatible with old data. 2. Control the output structure through MarshalJSON, such as converting field formats; 3. Parsing special format data through UnmarshalJSON, such as custom dates; 4. Pay attention to avoid infinite loops caused by recursive calls, and use type alias to bypass custom methods.

See all articles