grafanaソースコンパイル二次開発統合oauth 2


背景
既存のシステムにgrafanaの計器パネルを埋め込んでデータ展示を行うには、インターフェースを二次開発してスタイル統一を満たす必要があります.同時に、grafanaの権限部分を修正して、ページを満足させてシームレスにジャンプします.同時に現在のユーザーを識別します.
インストール
grafanaはnodejs、go、gitなどに依存しています.
grafanaをダウンロードしてv 7.0.0の分岐を選んで開発しました.
windowの上で環境構築を行うなら、GCC環境をインストールする必要があります.
ここではミニGW 64を使っていますが、ここではオペレーティングシステムによってインストールを選択します.64ビットのインストールを選択します.
インストールの過程はここを参考にしてもいいです.
遭遇した問題
  • go getのインストール速度が遅いです.
  • は、プロキシを構成することができます.go env-w GOPROXY=https://goproxy.cn
  • go getは、githubからコードをダウンロードしています.このコマンドを使わずに、直接に関連ディレクトリの下にあるgit clone
  • に行くことができます.
  • yarn installエラーgyp ERR!configure error yarn install--pure-lockfile--unsafe-perm
  • yarnはミラーソースを切り替え、ダウンロード速度を高めます.yarn config set registry‘https://registry.npm.taobao.org’またはnpm config set registryhttps://registry.npm.taobao.org cnpm:npm install-g cnpm--registry=も使用できます.https://registry.npm.taobao.org
  • Unwon/braを使用してgrafanaを起動する.
  • $GOPATH\src\golang.org\xで実行:git clonehttps://github.com/golang/sync.git --depth 1(depthはクローン深さを指定するために用いられ、1で最近のcomitだけをクローンするという意味)
  • go get github.com/Unwon/bra(ディレクトリを作成した後でも、git clone).ここで成功しても何の反応もありません.GOPATH\src\githb.com\nwon\braディレクトリの生成を確認したら、コマンドを停止することができます.
  • go run bra.go init初期化
  • go run bra.go runコンパイルbra
  • は、前後の端で構築に成功した後、grafanaディレクトリの下で、grafanaを実行することができ、ファイル修正は自動的に発行されます.
  • grafana包装
  • windowでgo run build.go build package生成を実行します.exe実行可能ファイルです.
  • linuxでgo run build.go build packageを実行すると、deb、rpm、tar.gzの3つのバージョンの圧縮パケットが生成されます.
  • 包装はdeb、rpmにします.fpm yum-y install ll by ruby bygems ruby-devel gem sources-aをインストールする必要があります.http://gems.ruby-china.com///元http://ruby.taobao.org/メンテナンスを中止しました.gem sources--removehttp://rubygems.org/ここでゲムinstall fpmは複雑です.deb、tar.gzだけ包装しました.包装rpm過程でエラーが発生しました.tar.gzはすでに要求を満たすことができますので、ここではあまり研究していません.包装は一回で20分近くかかります.我慢して待ってください.整合oauth 2
  • 匿名ログイン
  • ジャンプ中にgrafanaをイジェクトしない登録ウィンドウを実現するために、匿名登録プロファイルを使用することができる.
    #################################### Anonymous Auth ######################
    [auth.anonymous]
    # enable anonymous access
    ;enabled = true
    
    # specify organization name that should be used for unauthenticated users
    ;org_name = Main Org.
    
    # specify role for unauthenticated users
    ;org_role = Viewer
    
    「;enabled=true」のセミコロンを削除すると、設定が有効になります.
    このようにすべてのレポートページにアクセスするには、ログイン認証は必要ありません.もちろんoauth 2を統合すれば、この配置はオープンしなくてもいいです.
  • 統合oauth 2
  • grafanaでは、複数の第三者登録検証をサポートしています.
  • Github
  • GitLab
  • Google
  • Grafana.com
  • Azure AD
  • Okta
  • Generac
  • #################################### Generic OAuth ##########################
    [auth.generic_oauth]
    enabled = true
    name = OAuth
    allow_sign_up = true
    client_id = grafana
    client_secret = xxxxxx
    scopes = server
    ;email_attribute_name = email:primary
    ;email_attribute_path =
    auth_url = http://xxxxxx:8083/oauth/authorize
    token_url = http://xxxxxx:8083/oauth/token
    api_url = http://xxxxxxx:8083/oauth/check_token
    ;allowed_domains =
    ;team_ids =
    ;allowed_organizations =
    ;role_attribute_path =
    ;tls_skip_verify_insecure = false
    ;tls_client_cert =
    ;tls_client_key =
    ;tls_client_ca =
    
    具体的な状況に応じてパラメータを調整する必要があります.
    注:defaults.iniをコピーしてcustom.iniと名前を変えてカスタマイズを実現します.
    その他の配置説明
  • ホワイトリストとポート設定
  • #################################### Server ####################################
    [server]
    # Protocol (http, https, h2, socket)
    ;protocol = http
    
    # The ip address to bind to, empty will bind to all interfaces
    ;http_addr =
    
    # The http port  to use
    http_port = 8000
    
    # The public facing domain name used to access grafana from a browser
    domain = 172.20.4.250
    
    http_ポートはデフォルト3000ですが、windowの下でポートが衝突する可能性があります.
    domainはLAN ip:他のホストへのアクセスを避けるために、local hostがルーティングされません.
  • iframeページ調整によりクッキーが失われました.
  • #################################### Security ####################################
    [security]
    # disable creation of admin user on first start of grafana
    ;disable_initial_admin_creation = false
    
    
    # set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled"
    cookie_samesite = disabled
    
    # set to true if you want to allow browsers to render Grafana in a , 
    cookie_samesite = disabled
    
    allow_embedding = true
    
    ソース解析
  • は、GEnese OAuthを構成すると、第三者システムに移行してアイデンティティ検証を行うことができる.ここでは、2つのシステムのユーザ情報のフィールド設定が異なりますので、変更が必要です.
  • パッケージパスpkg/appiは、api.goがすべてのインターフェースルーティング構成である.
  • 	r.Get("/logout", hs.Logout)
    	r.Post("/login", quota("session"), bind(dtos.LoginCommand{}), Wrap(hs.LoginPost))
    	r.Get("/login/:name", quota("session"), hs.OAuthLogin)
    	r.Get("/login", hs.LoginView)
    	r.Get("/invite/:code", hs.Index)
    
    ジェネリックを使うのでoauth、登録するurlは/login/generaic_です.oauthですので、hs.OAuth Loginにジャンプしました.pkg/api/login_oauth.goで処理します.
  • ユーザ情報設定
  • 	extUser := &models.ExternalUserInfo{
    		AuthModule: "oauth_" + name,
    		OAuthToken: token,
    		AuthId:     userInfo.Id,
    		Name:       userInfo.Name,
    		Login:      userInfo.Login,
    		Email:      userInfo.Email,
    		OrgRoles:   map[int64]models.RoleType{},
    		Groups:     userInfo.Groups,
    	}
    
    ソースはtokenからユーザー情報を取得しましたが、認証センターのユーザー情報はjson形式でtokenに保存されています.
    //  token  user json  
    user := token.Extra("user")
    //  json    map
    userInfo, ok := user.(map[string]interface{})
    //       
    userInfo["nickName"]
    
    	extUser := &models.ExternalUserInfo{
    		AuthModule: "oauth_" + name,
    		OAuthToken: token,
    		AuthId:     fmt.Sprintf("%s", userInfo["id"]),
    		Name:       fmt.Sprintf("%s", userInfo["nickName"]),
    		Login:      fmt.Sprintf("%s", userInfo["username"]),
    		Email:      fmt.Sprintf("%s", userInfo["email"]),
    		OrgRoles:   map[int64]models.RoleType{},
    		//Groups:     groups,
    	}
    
    tokenのユーザ情報をgrafanaフレームに書き換える.このようにログインすれば、ユーザー情報を得ることができます.