Go SDK

go get으로 github.com/teramoby/speedle-sdk/go v0.2.0을 추가하고 로컬 Speedle 또는 Speedle Cloud에 대해 IsAllowed 및 Check를 호출합니다.

Go SDK는 최신 두 개의 Go 릴리스를 지원하며 표준 라이브러리만 사용합니다. 모듈: github.com/teramoby/speedle-sdk/go v0.2.0, 패키지 이름 speedle. 참조 문서: speedle-sdk/go.

예제에서는 SDK 개요에서 설명한 정책을 확인합니다.

의존성 추가

새 모듈에서 다음을 실행합니다:

go mod init example.com/speedle-example
go get github.com/teramoby/speedle-sdk/go@v0.2.0

로컬 Speedle 호출

SDK 개요의 설명에 따라 Speedle을 시작하고 예제 정책을 생성합니다. 이 프로그램을 main.go로 저장합니다:

package main

import (
	"context"
	"fmt"
	"os"

	speedle "github.com/teramoby/speedle-sdk/go"
)

func main() {
	client, err := speedle.NewClient(speedle.Config{
		Backend:     speedle.BackendSpeedle,
		Endpoint:    "http://localhost:6734",
		Auth:        speedle.NoAuth(),
		ServiceName: "docs",
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	defer client.Close()

	ctx := context.Background()
	allowed, err := client.IsAllowed(ctx, speedle.User("alice"), "get", "/docs/public", nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	fmt.Printf("alice get /docs/public: allowed=%t\n", allowed)

	d, err := client.Check(ctx, speedle.User("alice"), "delete", "/docs/public", nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	fmt.Printf("alice delete /docs/public: allowed=%t reason=%s\n", d.Allowed, d.Reason)
}

실행합니다:

go run .

출력:

alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NO_APPLICABLE_POLICIES

Speedle Cloud 호출

Speedle Cloud는 출시 예정입니다.

프로그램은 SPEEDLE_SERVICE에서 서비스 이름을, SPEEDLE_TOKEN에서 서비스 토큰을 읽습니다. SPEEDLE_ENDPOINT는 기본 엔드포인트 https://cloud.speedle.io를 재정의합니다. main.go를 다음과 같이 대체합니다:

package main

import (
	"context"
	"fmt"
	"os"

	speedle "github.com/teramoby/speedle-sdk/go"
)

func main() {
	endpoint := os.Getenv("SPEEDLE_ENDPOINT")
	if endpoint == "" {
		endpoint = "https://cloud.speedle.io"
	}
	client, err := speedle.NewClient(speedle.Config{
		Backend:     speedle.BackendSpeedleCloud,
		Endpoint:    endpoint,
		Auth:        speedle.BearerToken(os.Getenv("SPEEDLE_TOKEN")),
		ServiceName: os.Getenv("SPEEDLE_SERVICE"),
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	defer client.Close()

	ctx := context.Background()
	allowed, err := client.IsAllowed(ctx, speedle.User("alice"), "get", "/docs/public", nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	fmt.Printf("alice get /docs/public: allowed=%t\n", allowed)

	d, err := client.Check(ctx, speedle.User("alice"), "delete", "/docs/public", nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, "Speedle error:", err)
		os.Exit(1)
	}
	fmt.Printf("alice delete /docs/public: allowed=%t reason=%s\n", d.Allowed, d.Reason)
}

환경 변수를 설정하고 실행합니다. read -rs를 사용하면 토큰이 셸 기록이나 화면에 노출되지 않습니다:

export SPEEDLE_SERVICE=docs
read -rs SPEEDLE_TOKEN && export SPEEDLE_TOKEN
go run .

서비스에 예제 정책이 있는 경우 출력:

alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NO_APPLICABLE_POLICIES

토큰은 서버 측 비밀 값입니다. 브라우저, 모바일 앱 또는 데스크톱 클라이언트에 절대 배포하지 마십시오.

오류 처리

거부된 요청은 오류가 아닙니다. 위의 delete 호출과 같이 IsAllowed는 false를 반환하고, Check는 Allowed가 false이며 이유를 포함하는 결정을 반환합니다. 기본 구성에서 호출이 결정을 반환할 수 없는 경우 non-nil error가 반환됩니다(잘못된 구성인 경우 NewClient도 마찬가지입니다). 예제는 표준 오류로 Speedle error: <message>를 출력하고 종료 상태 1로 종료합니다.