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


go-stnscはSNTS APIクライアントとSTNS認証機能を提供します。

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

SNTS公式ページ
時代が求めたSTNSと僕

概要

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

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

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

実行例

API

  • Client Code:

以下のSTNSサーバを起動している場合の実行結果です。 stnsc.conf

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:
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認証を設定することが可能です。その場合は以下のようにユーザとパスワードを指定してください。

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

認証

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

- Client Code:

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:

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"}}

デモ

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

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

関連