Os guias de início rápido explicam como configurar e executar um app que chama uma
API Google Workspace.
Os guias de início rápido do Google Workspace usam as bibliotecas de cliente da API para lidar com alguns
detalhes do fluxo de autenticação e autorização. Recomendamos que você use as bibliotecas de cliente para seus próprios aplicativos. Neste guia de início rápido, usamos uma
abordagem de autenticação simplificada apropriada para um ambiente
de teste. Para um ambiente de produção, recomendamos aprender sobre
autenticação e autorização
antes de
escolher as credenciais de acesso
apropriadas para seu app.
Criar um aplicativo de linha de comando Go que faça solicitações para a API Activity do Google Drive.
Objetivos
- Configurar o ambiente.
- Configure a amostra.
- Execute a amostra.
Pré-requisitos
configurar o ambiente
Para concluir este guia de início rápido, configure seu ambiente.
Ativar a API
Antes de usar as APIs do Google, é preciso ativá-las em um projeto do Google Cloud.
É possível ativar uma ou mais APIs em um único projeto do Google Cloud.
Se você estiver usando um novo projeto do Google Cloud para concluir este guia de início rápido, configure a tela de permissão OAuth e adicione-se como usuário de teste. Se você já
concluiu essa etapa para seu projeto do Cloud, pule para a próxima seção.
-
No console do Google Cloud, acesse Menu menu
> APIs e serviços
> Tela de permissão OAuth.
Acessar a tela de permissão OAuth
- Em Tipo de usuário, selecione Interno e clique em Criar.
- Preencha o formulário de registro do app e clique em Salvar e continuar.
Por enquanto, é possível pular a adição de escopos e clicar em Salvar e continuar.
No futuro, quando você criar um app para uso fora da sua
organização do Google Workspace, será necessário alterar o Tipo de usuário para Externo e, em seguida,
adicionar os escopos de autorização exigidos pelo app.
- Analise o resumo de registro do seu app. Para fazer mudanças, clique em Editar. Se o registro
do app estiver correto, clique em Voltar para o painel.
Autorizar credenciais para um aplicativo de computador
Para autenticar os usuários finais e acessar os dados do usuário no seu app, você precisa
criar um ou mais IDs do cliente OAuth 2.0. Um ID do cliente é usado para identificar um único app nos servidores OAuth do Google. Caso seu app seja executado em várias plataformas,
você precisará criar um ID do cliente separado para cada uma delas.
-
No console do Google Cloud, acesse Menu menu > APIs e serviços > Credenciais.
Ir para Credenciais
- Clique em Criar credenciais > ID do cliente OAuth.
- Clique em Tipo de aplicativo > App para computador.
- No campo Nome, digite um nome para a credencial. Ele só aparece no console do Google Cloud.
- Clique em Criar. A tela cliente OAuth criado é exibida, mostrando seu novo ID e chave secreta do cliente.
- Clique em OK. A credencial recém-criada aparece em IDs do cliente OAuth 2.0.
- Salve o arquivo JSON salvo como
credentials.json
e mova-o para o diretório de trabalho.
Preparar o espaço de trabalho
Crie um diretório de trabalho:
mkdir quickstart
Mude para o diretório de trabalho:
cd quickstart
Inicialize o novo módulo:
go mod init quickstart
Acesse a biblioteca de cliente Go da API Google Drive Activity e o pacote OAuth2.0:
go get google.golang.org/api/driveactivity/v2
go get golang.org/x/oauth2/google
Configure a amostra
No diretório de trabalho, crie um arquivo chamado quickstart.go
.
Cole este código no arquivo:
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"reflect"
"strings"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/driveactivity/v2"
"google.golang.org/api/option"
)
// Retrieve a token, saves the token, then returns the generated client.
func getClient(config *oauth2.Config) *http.Client {
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
tokFile := "token.json"
tok, err := tokenFromFile(tokFile)
if err != nil {
tok = getTokenFromWeb(config)
saveToken(tokFile, tok)
}
return config.Client(context.Background(), tok)
}
// Request a token from the web, then returns the retrieved token.
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
fmt.Printf("Go to the following link in your browser then type the "+
"authorization code: \n%v\n", authURL)
var authCode string
if _, err := fmt.Scan(&authCode); err != nil {
log.Fatalf("Unable to read authorization code: %v", err)
}
tok, err := config.Exchange(context.TODO(), authCode)
if err != nil {
log.Fatalf("Unable to retrieve token from web: %v", err)
}
return tok
}
// Retrieves a token from a local file.
func tokenFromFile(file string) (*oauth2.Token, error) {
f, err := os.Open(file)
if err != nil {
return nil, err
}
defer f.Close()
tok := &oauth2.Token{}
err = json.NewDecoder(f).Decode(tok)
return tok, err
}
// Saves a token to a file path.
func saveToken(path string, token *oauth2.Token) {
fmt.Printf("Saving credential file to: %s\n", path)
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
log.Fatalf("Unable to cache oauth token: %v", err)
}
defer f.Close()
json.NewEncoder(f).Encode(token)
}
// Returns a string representation of the first elements in a list.
func truncated(array []string) string {
return truncatedTo(array, 2)
}
// Returns a string representation of the first elements in a list.
func truncatedTo(array []string, limit int) string {
var contents string
var more string
if len(array) <= limit {
contents = strings.Join(array, ", ")
more = ""
} else {
contents = strings.Join(array[0:limit], ", ")
more = ", ..."
}
return fmt.Sprintf("[%s%s]", contents, more)
}
// Returns the name of a set property in an object, or else "unknown".
func getOneOf(m interface{}) string {
v := reflect.ValueOf(m)
for i := 0; i < v.NumField(); i++ {
if !v.Field(i).IsNil() {
return v.Type().Field(i).Name
}
}
return "unknown"
}
// Returns a time associated with an activity.
func getTimeInfo(activity *driveactivity.DriveActivity) string {
if activity.Timestamp != "" {
return activity.Timestamp
}
if activity.TimeRange != nil {
return activity.TimeRange.EndTime
}
return "unknown"
}
// Returns the type of action.
func getActionInfo(action *driveactivity.ActionDetail) string {
return getOneOf(*action)
}
// Returns user information, or the type of user if not a known user.
func getUserInfo(user *driveactivity.User) string {
if user.KnownUser != nil {
if user.KnownUser.IsCurrentUser {
return "people/me"
}
return user.KnownUser.PersonName
}
return getOneOf(*user)
}
// Returns actor information, or the type of actor if not a user.
func getActorInfo(actor *driveactivity.Actor) string {
if actor.User != nil {
return getUserInfo(actor.User)
}
return getOneOf(*actor)
}
// Returns information for a list of actors.
func getActorsInfo(actors []*driveactivity.Actor) []string {
actorsInfo := make([]string, len(actors))
for i := range actors {
actorsInfo[i] = getActorInfo(actors[i])
}
return actorsInfo
}
// Returns the type of a target and an associated title.
func getTargetInfo(target *driveactivity.Target) string {
if target.DriveItem != nil {
return fmt.Sprintf("driveItem:\"%s\"", target.DriveItem.Title)
}
if target.Drive != nil {
return fmt.Sprintf("drive:\"%s\"", target.Drive.Title)
}
if target.FileComment != nil {
parent := target.FileComment.Parent
if parent != nil {
return fmt.Sprintf("fileComment:\"%s\"", parent.Title)
}
return "fileComment:unknown"
}
return getOneOf(*target)
}
// Returns information for a list of targets.
func getTargetsInfo(targets []*driveactivity.Target) []string {
targetsInfo := make([]string, len(targets))
for i := range targets {
targetsInfo[i] = getTargetInfo(targets[i])
}
return targetsInfo
}
func main() {
ctx := context.Background()
b, err := os.ReadFile("credentials.json")
if err != nil {
log.Fatalf("Unable to read client secret file: %v", err)
}
// If modifying these scopes, delete your previously saved token.json.
config, err := google.ConfigFromJSON(b, driveactivity.DriveActivityReadonlyScope)
if err != nil {
log.Fatalf("Unable to parse client secret file to config: %v", err)
}
client := getClient(config)
srv, err := driveactivity.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Fatalf("Unable to retrieve driveactivity Client %v", err)
}
q := driveactivity.QueryDriveActivityRequest{PageSize: 10}
r, err := srv.Activity.Query(&q).Do()
if err != nil {
log.Fatalf("Unable to retrieve list of activities. %v", err)
}
fmt.Println("Recent Activity:")
if len(r.Activities) > 0 {
for _, a := range r.Activities {
time := getTimeInfo(a)
action := getActionInfo(a.PrimaryActionDetail)
actors := getActorsInfo(a.Actors)
targets := getTargetsInfo(a.Targets)
fmt.Printf("%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets))
}
} else {
fmt.Print("No activity.")
}
}
Executar a amostra
No diretório de trabalho, crie e execute a amostra:
go run quickstart.go
-
Quando você executar o exemplo pela primeira vez, ele vai solicitar que você autorize o acesso:
-
Se você ainda não tiver feito login na sua Conta do Google, faça login quando solicitado. Se
você tiver feito login em várias contas, selecione uma para usar na autorização.
- Clique em Aceitar.
O aplicativo Go é executado e chama a API de atividade do Google Drive.
As informações de autorização são armazenadas no sistema de arquivos. Portanto, na próxima vez que você executar o
código de amostra, a autorização não será solicitada.
Próximas etapas