Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

関連

sonatard
組み込みC言語ネットワークスタック開発者からGoバックエンドエンジニアにジョブチェンジしました。 最近はTypeScript, React(Hooks), GraphQL, SwiftUIに夢中。
https://github.com/sonatard/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away