GoでRESTful APIとJSフロントエンドアプリを作成する場合、認証をどのように管理していますか?特定のライブラリまたはテクニックを使用していますか?
これについての議論がほとんどないことに驚きました。次のような回答を心に留めて、独自の実装の開発を避けようとしています。
全員が独自のソリューションを個別にコーディングしていますか?
この質問には多くの意見があり、人気のある質問バッジがあります。したがって、このトピックには多くの潜在的な関心があり、多くの人がまったく同じことを求めており、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
)
別の可能な解決策は Authboss で、最近メーリングで発表されました list 。
(私はこのライブラリを使用しようとしませんでした。)
ユーザー認証でwebappを作成する最良の方法? も参照してください。
ミドルウェアを使用して認証を行います。
基本認証およびダイジェスト認証には go-http-auth を、OAuth2には gomniauth を試すことができます。
ただし、認証方法はアプリによって異なります。
認証により、http.Handlersに状態/コンテキストが導入されます。これについては最近議論されています。
コンテキストの問題に対するよく知られた解決策は、 gorilla/context および google context 記述 here です。
go-on/wrap でグローバル状態を必要とせずに、より一般的なソリューションを作成しました。
wraphttpauth go-http-authとgo-on/wrapの統合を提供します。
Cookieを使用した認証を処理するための別のオープンソースパッケージは、 httpauth です。
(ちなみに私が書いた)
2018年にこれに答えます。JWT(JSON Web Token)を使用することをお勧めします。解決済みとマークした答えには欠点があります。これは、front(user)とback(server/db)で行った旅行です。ユーザーが認証を必要とするリクエストを頻繁に行った場合、さらに悪いことに、サーバーとデータベースとの間でリクエストが肥大化します。これを解決するには、アクセス/リクエストが必要なときにいつでもユーザーが使用できるトークンをユーザーエンドに保存するJWTを使用します。トークンの有効性を確認するためにデータベースやサーバーの処理にアクセスする必要はありません。
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
}))