web-dev-qa-db-ja.com

Goで認証を管理する人々はどうですか?

GoでRESTful APIとJSフロントエンドアプリを作成する場合、認証をどのように管理していますか?特定のライブラリまたはテクニックを使用していますか?

これについての議論がほとんどないことに驚きました。次のような回答を心に留めて、独自の実装の開発を避けようとしています。

ASP.Netの認証フォーム

全員が独自のソリューションを個別にコーディングしていますか?

172
SexxLuthor

この質問には多くの意見があり、人気のある質問バッジがあります。したがって、このトピックには多くの潜在的な関心があり、多くの人がまったく同じことを求めており、Interwebsで答えを見つけていません。

利用可能な情報の大部分は、「読者のための運動」として残された、手で波打つものに相当するテキストになります。 ;)

しかし、最終的にgolang-nutsメーリングリストのメンバーが(一般的に)提供する具体的な例を1つ見つけました。

https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ

これにより、カスタム認証の基礎として推奨されるスキーマとサーバー側の実装が提供されます。クライアント側のコードはあなた次第です。

(投稿の著者がこれを見たことを願っています:ありがとう!)

抜粋(および再フォーマット):


「次のようなデザインを提案します。

create table User (
 ID int primary key identity(1,1),
 Username text,
 FullName text,
 PasswordHash text,
 PasswordSalt text,
 IsDisabled bool
)

create table UserSession (
 SessionKey text primary key,
 UserID int not null, -- Could have a hard "references User"
 LoginTime <time type> not null,
 LastSeenTime <time type> not null
)
  • ユーザーがTLSでPOSTを介してサイトにログインするとき、パスワードが有効かどうかを判断します。
  • 次に、ランダムセッションキーを発行します。たとえば、50個以上の暗号化されたRand文字と安全なCookieに入れます。
  • そのセッションキーをUserSessionテーブルに追加します。
  • その後、そのユーザーが再び表示されたら、最初にUserSessionテーブルにアクセスして、有効なLoginTimeとLastSeenTimeでSessionKeyがそこにあるかどうかを確認し、ユーザーは削除されません。タイマーがUserSessionの古い行を自動的にクリアするように設計できます。」
106
SexxLuthor

別の可能な解決策は Authboss で、最近メーリングで発表されました list

(私はこのライブラリを使用しようとしませんでした。)

ユーザー認証でwebappを作成する最良の方法? も参照してください。

17
SexxLuthor

ミドルウェアを使用して認証を行います。

基本認証およびダイジェスト認証には go-http-auth を、OAuth2には gomniauth を試すことができます。

ただし、認証方法はアプリによって異なります。

認証により、http.Handlersに状態/コンテキストが導入されます。これについては最近議論されています。

コンテキストの問題に対するよく知られた解決策は、 gorilla/context および google context 記述 here です。

go-on/wrap でグローバル状態を必要とせずに、より一般的なソリューションを作成しました。

wraphttpauth go-http-authとgo-on/wrapの統合を提供します。

14
metakeule

Cookieを使用した認証を処理するための別のオープンソースパッケージは、 httpauth です。

(ちなみに私が書いた)

6
Cameron Little

2018年にこれに答えます。JWT(JSON Web Token)を使用することをお勧めします。解決済みとマークした答えには欠点があります。これは、front(user)とback(server/db)で行った旅行です。ユーザーが認証を必要とするリクエストを頻繁に行った場合、さらに悪いことに、サーバーとデータベースとの間でリクエストが肥大化します。これを解決するには、アクセス/リクエストが必要なときにいつでもユーザーが使用できるトークンをユーザーエンドに保存するJWTを使用します。トークンの有効性を確認するためにデータベースやサーバーの処理にアクセスする必要はありません。

5
mfathirirhas

Labstack Echo をご覧ください。RESTfulAPIおよびフロントエンドアプリケーションの認証を特定のAPIルートを保護するために使用できるミドルウェアにラップします。

たとえば、基本認証の設定は、/adminルートの新しいサブルーターを作成するのと同じくらい簡単です。

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

ここでLabstackのミドルウェア認証オプションをすべて参照してください。

0
Adil B