LoginSignup
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-05

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

GoDoc

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

関連

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10