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_POLICIESSpeedle 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로 종료합니다.