STNS APIクライアント & WebサービスでSTNSユーザ認証を実現するgo-stnsc

[go-stnsc](https://github.com/sona-tar/go-stnsc)はSNTS APIクライアントとSTNS認証機能を提供します。
===============================

[![GoDoc](https://godoc.org/github.com/sona-tar/go-stnsc?status.svg)](https://godoc.org/github.com/sona-tar/go-stnsc/stnsc)

`go-stnsc` はSTNS v2 JSONフォーマットに対応しています。

[SNTS公式ページ](http://stns.jp/)
[時代が求めたSTNSと僕](https://speakerdeck.com/pyama86/shi-dai-gaqiu-metastnstopu)


## 概要
STNSは、Linuxユーザログインを目的に作成された認証プロトコルです。
プロトコルとしてはLinuxユーザログインに限定されているものではなく、名前解決全般に利用することができます。

そのため自作Webサービスのログインの認証にも用いることが可能です。そこでGolangからSTNSのAPIを叩くためのライブラリを作成しました。

またSTNSプロトコルは基本的にサーバサイドの情報を取得するだけであり、認証はクライアント側で実装する必要があるので`Authenticate`メソッドも実装しました。

## 実行例

### API

- Client Code:

以下のSTNSサーバを起動している場合の実行結果です。　[stnsc.conf](https://github.com/sona-tar/docker-compose-stns/blob/master/stns.conf)

```go
func main() {
	client, err := stnsc.NewClient("http://localhost:1104/v2/", nil)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	var err error

	var attrUsers stns.Attributes
	attrUsers, err = client.User.List()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Printf("Attributes users : %#v\n", attrUsers)
	fmt.Printf("Attribute user : %#v\n", attrUsers["foo"])

	var attrUser *stns.Attribute
	attrUser, err = client.User.Get("foo")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Printf("Attribute user : %#v\n", attrUser)
	fmt.Printf("user : %#v\n", attrUser.User)

	attrUser, err = client.User.GetById(1002)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Printf("Attribute user : %#v\n", attrUser)
	fmt.Printf("user : %#v\n", attrUser.User)
}
```

- Output:

```text
Attributes users : stns.Attributes{"bar":(*stns.Attribute)(0xc4200e01e0), "foo":(*stns.Attribute)(0xc4200e02a0)}
Attribute user : &stns.Attribute{Id:1001, User:(*stns.User)(0xc4200f0180), Group:(*stns.Group)(nil)}
Attribute user : &stns.Attribute{Id:1001, User:(*stns.User)(0xc420152000), Group:(*stns.Group)(nil)}
user : &stns.User{Password:"$6$RNqhn2ttIfMcRj4r$Ddnbckw1T1xUkguDWvSsb3GZseoeahRbr27vKbYV9opja2SKWi6y.67YI0yXz8HremKCpJwwFEOqed6Eic9.0.", GroupId:1002, Directory:"/home/foo", Shell:"/bin/bash", Gecos:"description", Keys:[]string{"key"}, LinkUsers:[]string{"linkuser"}}
Attribute user : &stns.Attribute{Id:1002, User:(*stns.User)(0xc4200f0480), Group:(*stns.Group)(nil)}
user : &stns.User{Password:"$6$gu42K/pg0o7NBP9O$NshQ3iHO4gE3av9.tkE6DWCgA0h1vG1TzH.SHfQn.TEZpmFBVSD0G7pnH3SGKj22RFz5qiy3ezMg6UQ6JJejE.", GroupId:1002, Directory:"/home/bar", Shell:"/bin/bash", Gecos:"description", Keys:[]string{"key"}, LinkUsers:[]string{"linkuser"}}
```

またSTNSサーバはBasic認証を設定することが可能です。その場合は以下のようにユーザとパスワードを指定してください。

```go
func main() {
        tp := &stnsc.BasicAuthTransport{
                Username: "basicuser",
                Password: "basicpass",
        }

        client, err := stnsc.NewClient("http://localhost:1104/v2/", tp.Client())
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
```

他のAPIの使い方はこちらのexampleを参考にしてください。 [example/main.go](./example/main.go)

### 認証

あたなのWebサービスに簡単にログイン認証機構を提供することができます。

- Client Code:
- 
```go
func main() {
	client, err := stnsc.NewClient("http://localhost:1104/v2/", nil)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	var err error
	var attrUser *stns.Attribute
	attrUser, err = client.User.Authenticate("foo", "foopass")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Printf("Attribute user : %#v\n", attrUser)
	fmt.Printf("user : %#v\n", attrUser.User)
}
```

- Output:
- 
```text
user : &stns.User{Password:"$6$72qH5tfJta43J1lH$o1OvvIxkDCNZtrAh3UWM9dKkGawTuBeGpLoxRuICH6B/9.Y5PA/bD
tvm.fK/bB8zFNNofus6jQHXzMyiqCCqj0", GroupId:1001, Directory:"/home/example", Shell:"/bin/bash", Gecsoo:"", Keys:[]string{"ssh-rsa XXXXX…"}, LinkUsers:[]string{"foo"}}
```

## デモ

実際に実行する方法は、以下の通りです。

- Create STNS Server
 - See [docker-compose-stns](https://github.com/sona-tar/docker-compose-stns)

- Client

```shell
$ go get -v github.com/sona-tar/go-stnsc
$ cd ${GOPATH}/src/github.com/sona-tar/go-stnsc/example
$ go run main.go
```


## 関連
- [あなたのWebサービスでLDAPユーザ認証を実現するgo-ldapc](http://qiita.com/sona-tar/items/0497a447e789b12de251)