ラベル OpenIDConnect の投稿を表示しています。 すべての投稿を表示
ラベル OpenIDConnect の投稿を表示しています。 すべての投稿を表示

2023年3月16日木曜日

MinIOでOneloginのOpenIDConnectを使って認証する方法

MinIOでOneloginのOpenIDConnectを使って認証する方法

概要

MinIO にはデフォルトでOpenIDConnectに接続するための機能が実装されています
今回は Onelogin を使って OpenIDConnect 認証できるようにしてみました

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • minio RELEASE.2022-10-24T18-35-07Z

注意事項

gateway モードでは使えません

流れ

  1. MinIO 起動
  2. MinIO にグループのポリシーを追加
  3. Onelogin 側の設定
  4. ログイン

MinIO の起動

まずは MinIO を起動します
今回は docker を使います

ポイントは MINIO_IDENTITY_OPENID_ で始まる環境変数でここに Onelogin の認証情報を登録します

MINIO_IDENTITY_OPENID_CLAIM_NAME は groups という値にしています
これは Onelogin から送られてきたトークンに含まれる groups というフィールドをもとに MinIO 内で使用するポリシーを選択するために使用されます
特定のグループに対するポリシー情報の登録は後ほど行います

リダイレクトURLは http://localhost:9100/oauth_callback を設定します
MinIO には oauth_callback というリダイレクト用の URI が用意されいます
Onelogin の場合 localhost 以外のコールバック URL を指定する場合は https 化が必須なので注意しましょう

docker run --rm -p 9100:9100 -p 9000:9000 --name minio-s3 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=xxx" \
-v ~/minio/data:/data \
-e "MINIO_IDENTITY_OPENID_CLAIM_NAME=groups" \
-e "MINIO_IDENTITY_OPENID_CONFIG_URL=https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration" \
-e "MINIO_IDENTITY_OPENID_CLIENT_ID=xxxx" \
-e "MINIO_IDENTITY_OPENID_CLIENT_SECRET=xxxx" \
-e "MINIO_IDENTITY_OPENID_SCOPES=groups email openid profile" \
-e "MINIO_IDENTITY_OPENID_REDIRECT_URI=http://localhost:9100/oauth_callback" \
quay.io/minio/minio:RELEASE.2022-10-24T18-35-07Z server /data --console-address ":9100"

MinIO にグループのポリシーを追加

MinIO が起動できたらグループに対する MinIO 上で割り当てるポリシーを作成します

ポリシーの割り当てには MinIO 用の mc という CLI ツールを使います

先にポリシー用のファイルを作成します

  • vim allaccess.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

あとはこれと mc コマンドを使って起動した MinIO にポリシーを登録します

  • docker run --name mc -it --entrypoint=/bin/sh minio/mc

mc コマンドコール用のコンテナが起動したらファイルを送ります

  • docker cp allaccess.json mc:/

そしてポリシーを登録します

  • mc alias set myminio http://172.17.0.1:9000 admin password
  • mc admin policy add myminio admin allaccess.json

上記の場合 1. 先程起動した MinIO を myminio という名前で登録 2. myminio の admin グループに allaccess.json のポリシーを登録という流れになります

なのでもし Onelogin から送られてくる groups 情報に admin ではなく別のグループ名が含まれている場合は admin の部分を適当なグループ名に変更してポリシー登録してください

Onelogin 側の設定

Onelogin 側ではコールバック用の URL を追加するくらいかなと思います

詳しい設定方法や認証情報の確認方法は過去に紹介しているのでそちらを参照してください

動作確認ログイン

localhost:9100 にアクセスするとログインボタンが表示されます
クリックすると Onelogin のログイン画面に遷移するのでログインしましょう

トラブルシューティング

おそらく一番目にするのは Policy claim missing from the JWT token, credentials will not be generated というエラーかなと思います
これは Onelogin から送られてきたトークン情報に policy というフィールドがないから MinIO 内で使用するポリシー情報を割り当てられませんというエラーになります

この policy という値をコントロールするのが MINIO_IDENTITY_OPENID_CLAIM_NAME になります
Onelogin では policy フィールドはトークンに含まれていません
なので groups フィールドを使うために MINIO_IDENTITY_OPENID_CLAIM_NAME=gropus にしています

IdP から送られてくるトークン情報をデバッグする方法は以下のコマンドで実行することで確認できます

  • mc admin trace -v -a myminio

WebIdentityToken というフィールドがJSONトークン情報になります
トークン情報はエンコードされているのでデコードして確認してください

最後に

MinIO で OpenIDConnect に接続する方法を紹介しました
IdP 側が送信するトークン情報に応じて対応が少し異なるので注意が必要です
IdP 側から直接ポリシー情報を送信することもできるようです

参考サイト

2023年3月8日水曜日

Quasar ですべてのページにアクセスする前に特定の処理をさせる方法

Quasar ですべてのページにアクセスする前に特定の処理をさせる方法

概要

例えば認証をつけたい場合に使えます
前回のアプリケーションをベースに変更していきます

環境

  • macOS 11.7.4
  • nodejs 19.6.0
    • yarn 1.22.19
    • quasar 2.0.0
  • Python 3.10.9
    • Flask 2.2.3
    • Flask-CORS 3.0.10
    • authlib 1.2.0

axios のリクエストを管理する (src/boot/axios.js)

バックエンドとやり取りする api をアプリケーション全体で管理するようにします

  • vim src/boot/axios.js
import { boot } from 'quasar/wrappers'
import axios from 'axios'

const api = axios.create({ 
  baseURL: 'http://localhost:5000',
  withCredentials: true
})

export default boot(({ app }) => {
  app.config.globalProperties.$axios = axios
  app.config.globalProperties.$api = api
})

export { axios, api }

ルーティングの設定 (src/router/routes.js)

認証が必要なページと不要なページを設定します
認証が必要なページは meta.requiresAuth を設定します

  • vim src/router/routes.js
const routes = [
  {
    path: '/',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      { path: '', component: () => import('pages/IndexPage.vue'), meta: { requiresAuth: true } }
    ]
  },
  {
    path: '/login',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      { path: '', component: () => import('pages/LoginPage.vue') }
    ]
  },
  {
    path: '/:catchAll(.*)*',
    component: () => import('pages/ErrorNotFound.vue')
  }
]

export default routes

beforeEach を router に追加する (src/router/index.js)

Quasar の beforeEach という機能を使うことですべてのページに対して共通して実施したいことを定義できます

先程各ページに付与した meta.requiresAuth が有効なページの場合に認証済みかどうかをバックエンドに聞きに行くような処理を追加します

バックエンド側にはあとで /verify というエンドポイントを追加して認証が完了しているかチェックする機能を追加します

/verify でエラーが返ってきた場合は Quasar のログインページを表示します

  • vim src/router/index.js
import { route } from 'quasar/wrappers'
import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router'
import routes from './routes'
import { api } from 'boot/axios'

export default route(function (/* { store, ssrContext } */) {
  const createHistory = process.env.SERVER
    ? createMemoryHistory
    : (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory)

  const Router = createRouter({
    scrollBehavior: () => ({ left: 0, top: 0 }),
    routes,
    history: createHistory(process.env.MODE === 'ssr' ? void 0 : process.env.VUE_ROUTER_BASE)
  })

  // ここを追加する
  Router.beforeEach((to, from, next) => {
    if (to.matched.some(record => record.meta.requiresAuth)) {
      // 認証が必要なページはバックエンドに問い合わせる
      api.get('/verify')
        .then((response) => {
          console.log(response.data)
          next()
        })
        .catch((error) => {
          console.log(error)
          next('/login')
        })
    } else {
      // 認証が不要なページはそのまま表示する
      next()
    }
  })

  return Router
})

注意事項

本当は catch したところでバックエンドのログインページに飛ばしてあげてもいいのですがそうすると無限ループになってしまうのでそうならないように認証が不要なログインページを用意してあげる必要があります

ログイン用のページ (src/pages/LoginPage.vue)

このページには認証がありません
ログイン/ログアウトボタンとログインしたあとで取得できるユーザ情報を表示しています

  • vim src/pages/LoginPage.vue
<template>
  <div>
    <h1>Login Test Page</h1>
    <div>{{ data }}</div>
    <button @click="login">Login</button>
    <button @click="logout">Logout</button>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import { api } from 'boot/axios'

const data = ref('nodata')

const fetchUser = async(value) => {
  api.get('/user')
    .then((response) => {
      data.value = response.data
    })
    .catch((error) => {
      console.log(error)
    })
}

const login = async(value) => {
    window.location.href = 'http://localhost:5000/login';
}

const logout = async(value) => {
  api.get('/logout')
    .then((response) => {
      data.value = response.data
    })
    .catch((error) => {
      console.log(error)
    })
}

onMounted(() => {
  fetchUser()
})
</script>

バックエンドの処理

基本は前回と同じですが verify メソッドを追加しています
verify ではセッション(クッキー)に値が設定されているかをチェックしています

  • vim app.py
from typing import Any, Optional
from flask import (Flask,
                   url_for,
                   session,
                   redirect)
from flask_cors import CORS
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = "xxxx"
app.config["ONELOGIN_CLIENT_ID"] = "xxxx"
app.config["ONELOGIN_CLIENT_SECRET"] = "xxxx"
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_HTTPONLY"] = True
CORS(app,
     supports_credentials=True,
     max_age=300)

oauth = OAuth(app)
oauth.register(
  name="onelogin",
  server_metadata_url="https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration",
  client_kwargs={"scope": "openid email profile"}
)


def get_session() -> Optional[Any]:
    return session.get("user")


def has_session() -> bool:
    user = get_session()
    if user is None:
        return False
    return True


@app.route("/user")
def user():
    if not has_session():
        return "Not logged in yet."
    return f"Login successful. => {get_session()}"


@app.route("/verify")
def verify():
    if not has_session():
        return "Not logged in yet.", 400
    return "Already logged in."


@app.route("/login")
def login():
    redirect_uri = url_for("auth", _external=True)
    return oauth.onelogin.authorize_redirect(redirect_uri)


@app.route("/callback")
def auth():
    token = oauth.onelogin.authorize_access_token()
    session["user"] = token["userinfo"]
    return redirect("http://localhost:8080/#/login")


@app.route("/logout")
def logout():
    session.pop("user", None)
    return "Logout successful."

動作確認

  • quasar dev
  • pipenv run flask run

で localhost:8080/#/ にアクセスすると強制的にログインページに飛ばされるのが確認できます
そして OpenIDConnect でログイン後には localhost:8080/#/ に無事アクセスできることが確認できると思います

最後に

Quasar で全ページに対して行う共通処理を実現する方法を紹介しました
特定のページにのみ実施したい場合には meta 情報を使って beforeEach で判断するようなテクニックがあります

ログアウトするとアプリケーション内のセッションは消えますが OpenIDConnect を提供している Idp 側ではまだセッションが残っている場合があります
ログアウト時に Idp 側のセッションもログアウトにする方法があるので興味がある方は調べてみてください

参考サイト

2023年3月7日火曜日

QuasarでOpenIDConnect認証連携する方法

QuasarでOpenIDConnect認証連携する方法

概要

Quasar で OpenIDConnect 認証する方法を紹介します
バックエンドに Flask アプリケーションを使って連携します
今回連携する OpenIDConnect 先は Onelogin になります

環境

  • macOS 11.7.4
  • nodejs 19.6.0
    • yarn 1.22.19
    • quasar 2.0.0
  • Python 3.10.9
    • Flask 2.2.3
    • Flask-CORS 3.0.10
    • authlib 1.2.0

Quasarプロジェクトの作成

こちらを参考に作成しましょう
error @achrinza/node-ipc@9.2.5: The engine "node" is incompatible with this module. が発生する場合は

  • yarn config set ignore-engines true

を設定しましょう

Quasar 側のログインテストページの作成

  • vim src/pages/LoginPage.vue
<template>
  <div>
    <h1>Login Test Page</h1>
    <button @click="login">Login</button>
    <button @click="logout">Logout</button>
    <div>{{ data }}</div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'

const data = ref('nodata')

const api = axios.create({ 
  baseURL: 'http://localhost:5000',
  withCredentials: true
})

const fetchUser = async(value) => {
  api.get('/user')
    .then((response) => {
      data.value = response.data
    })
    .catch((error) => {
      console.log(error)
    })
}

const login = async(value) => {
    window.location.href = 'http://localhost:5000/login';
}

const logout = async(value) => {
  api.get('/logout')
    .then((response) => {
      data.value = response.data
    })
    .catch((error) => {
      console.log(error)
    })
}

onMounted(() => {
  fetchUser()
})
</script>

またルーティングを追加しましょう

  • vim src/router/routes.js
const routes = [
  {
    path: '/',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      { path: '', component: () => import('pages/IndexPage.vue') }
    ]
  },
  {
    path: '/login',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      { path: '', component: () => import('pages/LoginPage.vue') }
    ]
  },

  // Always leave this as last one,
  // but you can also remove it
  {
    path: '/:catchAll(.*)*',
    component: () => import('pages/ErrorNotFound.vue')
  }
]

export default routes

起動は

  • quasar dev

で行います
localhost:8080/#/login にアクセスすると OpenIDConnect のログインテスト用のページが表示されます

バックエンドの Flask アプリをまだ作成していないので動作はしません

Flask でバックエンドアプリの作成

flask-cors, authlib を使うのでインストールしましょう

  • pipenv install flask-cors authlib

今回 OpenIDConnect との連携はすべて Flask 側で行います
認証が成功して Flask 側で ID トークンを受け取ったらそれを session (cookies) に保存して SPA 側と共有します

from flask import (Flask,
                   url_for,
                   session,
                   redirect)
from flask_cors import CORS
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = "xxx"
app.config["ONELOGIN_CLIENT_ID"] = "xxxx"
app.config["ONELOGIN_CLIENT_SECRET"] = "xxxx"
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_HTTPONLY"] = True
CORS(app,
     supports_credentials=True,
     max_age=300)

oauth = OAuth(app)
oauth.register(
  name="onelogin",
  server_metadata_url="https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration",
  client_kwargs={"scope": "openid email profile"}
)


@app.route("/login")
def login():
    redirect_uri = url_for("auth", _external=True)
    return oauth.onelogin.authorize_redirect(redirect_uri)


@app.route("/user")
def user():
    user = session.get("user")
    if user is None:
        return "Not logged in yet."
    return f"Login successful. => {user}"


@app.route("/callback")
def auth():
    token = oauth.onelogin.authorize_access_token()
    session["user"] = token["userinfo"]
    return redirect("http://localhost:8080/#/login")


@app.route("/logout")
def logout():
    session.pop("user", None)
    return "Logout successful."

起動しましょう

  • pipenv run flask run

これでバックエンドは localhost:5000 で起動します
当然ですが Quasar は localhost:8080 で起動しバックエンドは localhost:5000 で起動しているので CORS の設定が必要です

ポイント

ログインはSPA側からバックエンドにリダイレクトする

OpenIDConnet のログインページへのリダイレクトは Flask 側で行います
なので SPA 側からログインページを表示したい場合はまずバックエンドの /login URI へリダイレクトする必要があります

SPA からリダイレクトをせずに Flask から直接ログインページへリダイレクトしようとすると CORS エラーになるので注意が必要です

SPA側とバックエンド側の認証情報の共有はセッション(cookies)を使う

クッキー情報はドメインごとに管理されます
しかし今回はドメインが異なるので異なるドメイン間でクッキーを共有する必要があります

Quasar 側では withCredentials: true を設定することで axios リクエスト時にバックエンドにクッキー情報を送信できます

Flask 側では CORS(app, supports_credentials=True, max_age=300) という感じで supports_credentials=True にすることで送信された異なるドメインから送信されたクッキーを受け入れることができます

セキュリティ的な面を考慮する

今回はクッキーの Secure 属性と HTTP-Only 属性のみ有効にしています
あとは CORS 側の設定で max_age を設定して共有する有効期限を定めています

そもそもクッキーを使わない方法もあるようなのでプロダクションではセキュリティ麺を考慮した設定が実装の追加が必要になるかなと思います

最後に

Quasar に OpenIDConnect を使った認証機能を追加してみました
基本はバックエンド側のアプリが必要になると思います (調べてみると SPA オンリーでもできるっぽいですが)

SPA はモダンなのですが考えることが多いのが厄介です
そういうのも含めると普通に Web アプリケーションとして作成するのがいいのかもしれません

2023年3月6日月曜日

Gitlab と AzureAD の OpenIDConnect で認証連携する方法

Gitlab と AzureAD の OpenIDConnect で認証連携する方法

概要

前回 AzureAD + SAML 認証を紹介しました
今回は AzureAD + OpenIDConnect の連携方法を紹介します

環境

  • Gitlab 15.6.8-ee
  • AzureAD (2023/03/02 時点)

アプリケーションの登録

まずは Azure AD にアプリケーションを登録します

ディレクトリのトップ画面に移動します

そして左メニューから「アプリの登録」を選択し「新規登録」します

アプリの名称を入力します
そして重要なリダイレクトURIを入力します
リダイレクト URI「Web」を選択し Gitlab の URL + /users/auth/openid_connect/callback を入力します

エンドポイントとクライアントIDの確認

アプリケーションが作成できたら「エンドポイント」を選択し OpenIDConnect 用のエンドポイントを確認します

またアプリケーションの詳細画面に「アプリケーション(クライアントID)」があるのでこれもメモしておきます

シークレットの作成

次にシークレット情報を作成します
左メニューの「証明書とシークレット」を選択し「新しいクライアントシークレット」を選択します

説明とシークレットの有効期限を設定しましょう
シークレットの有効期限は無限にはできないですが日付指定はできるのでそれを使って期間を延長しましょう

使用するのはシークレットIDではなく値の方になります

その他

  • アプリケーションへのユーザの登録は必要に応じて行う
  • トークン構成から email 情報を追加する必要はなさそう

gitlab.rb の編集

作成したアプリケーションの情報を展開します
編集する箇所は以下の通りです

  • issuer・・・アプリケーションのエンドポイントで確認した OpenIDConnect 用の URL を記載
  • client_options.identifier・・・アプリケーションのクライアントIDを記載
  • client_options.secret・・・アプリケーションに作成したシークレットの値情報を記載
  • client_options.redirect_uri・・・アプリケーション作成時に登録したリダイレクトURIを記載
gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = false
gitlab_rails['omniauth_providers'] = [
  {
    name: "openid_connect",
    label: "Azure OIDC",
    args: {
      name: "openid_connect",
      scope: ["openid", "profile", "email"],
      response_type: "code",
      issuer:  "https://login.microsoftonline.com/xxxxxxxxxxxx/v2.0",
      client_auth_method: "query",
      discovery: true,
      uid_field: "preferred_username",
      pkce: true,
      client_options: {
        identifier: "xxxxxxxxxxxx",
        secret: "xxxxxxxxxxx",
        redirect_uri: "https://your.gitlab.com/users/auth/openid_connect/callback"
      }
    }
  },
]

動作確認

あとは reconfigure してログインページから Azure OIDC でログインできるか確認しましょう

初回アクセス時にはアプリケーションからのアクセス許可が必要なので許可しましょう

最後に

Gitlab + AzureAD + OpenIDConnect の連携方法を紹介しました
Gitlab と AzureAD の認証連携をする場合には SAML or OpenIDConnect を選択できます
基本は SAML で OK ですが用途に合わせては OpenIDConnect を使うのもありかなと思います

この辺りの認証情報の取捨選択は環境に合わせて選択する必要があります

参考サイト

2023年3月5日日曜日

Python で OpenIDConnect を使って認証する方法

Python で OpenIDConnect を使って認証する方法

概要

Python の authlib を使えば簡単に OpenIDConnect を使った認証機能を Web アプリケーションに追加することができます

今回は Flask + authlib を使って Onelogin の OpenIDConnect に接続して認証を追加してみました

環境

  • macOS 11.7.4
  • Python 3.10.2
  • authlib 1.2.0
  • Flask 2.2.3

Onelogin 側の設定

OIDC アプリを作成してユーザの追加やリダイレクトURIの設定をしておきましょう
リダイレクトURIは今回は localhost で動作させるので「http://localhost:5000/callback」 を追加しておきましょう

あとはコードに必要になる「Client ID」「Client Secret」「Issuer URL」あたりをコピーしておきます

サンプルコード

  • vim app.py
from flask import (Flask,
                   url_for,
                   session,
                   redirect)
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = "xxx"
app.config["ONELOGIN_CLIENT_ID"] = "xxxx"
app.config["ONELOGIN_CLIENT_SECRET"] = "xxxx"

oauth = OAuth(app)
oauth.register(
  name="onelogin",
  server_metadata_url="https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration",
  client_kwargs={"scope": "openid email profile"}
)


@app.route("/")
def homepage():
    user = session.get("user")
    if user is None:
      return redirect("/login")
    return f"user => {user}"


@app.route("/login", methods=["GET"])
def login():
    redirect_uri = url_for("auth", _external=True)
    return oauth.onelogin.authorize_redirect(redirect_uri)


@app.route("/callback")
def auth():
    token = oauth.onelogin.authorize_access_token()
    session["user"] = token["userinfo"]
    return redirect("/")


@app.route("/logout")
def logout():
    session.pop("user", None)
    return redirect("/")

設定を変更するのは ONELOGIN_CLIENT_ID, ONELOGIN_CLIENT_SECRET, server_metadata_url です

動作確認

  • pipenv run flask run

でブラウザで localhost:5000 にアクセスすると onelogin のログイン画面になるのでそこでログ人すれば OK です

最後に

Python の authlib を使って OpenIDConnect 認証を追加する方法を紹介しました
OpenIDConnect 自体 OAuth2 のラップなので認証方法はほぼ OAuth2 と同じになります

参考サイト

2023年3月3日金曜日

GitlabでOneloginのOpenIDConnectを使ってログインする方法

GitlabでOneloginのOpenIDConnectを使ってログインする方法

概要

Gitlab のログインに onelogin の OpenIDConnect (OIDC) を使ってログインする方法を紹介します

ちなみに onelogin の OIDC は有料プランでないと使えないので注意しましょう

環境

  • Gitlab-ee 15.6.7
  • Onelogin 2023/03/01 時点

Onelogin側のOIDCアプリの設定

1. 認証情報の確認

作成した OIDC アプリの「SSO」メニューで連携に必要な情報を確認できます

このページ内の

  • Client ID
  • Client secret
  • Issuer URL

はメモしておきましょう
また画面にはないですが少し下に「Token Endpoint」という項目があるのでそこが「Basic」になっていることを確認しておきましょう

2. リダイレクトURLの設定

認証後のリダイレクト URL を設定します
これは Gitlab 側から指定された URL があるのでそれを指定します

Gitlab の URL + /users/auth/openid_connect/callback を指定すれば OK です
またこの URL は gitlab.rb 編集時にも使います

OneLogin側のOIDCアプリへログインさせるユーザの追加

OIDC アプリを使って認証させるユーザは個別に追加する必要があります
ユーザ個別でも追加できますしロール単位でも追加できるので認証させたいユーザを追加しましょう

動作確認のログイン時に Could not authenticate you from OpenIDConnect because "End-user does not have access to this application". が表示される場合はこのユーザの追加がうまく行っているか確認してみてください

gitlab.rb の編集

あとは gitlab.rb を編集します

gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = false
gitlab_rails['omniauth_providers'] = [
  {
    name: "openid_connect",
    label: "Onelogin OIDC",
    args: {
      name: "openid_connect",
      scope: ["openid", "profile", "email"],
      response_type: "code",
      issuer: "https://xxxxxx.onelogin.com/oidc/2",
      discovery: true,
      client_auth_method: "basic",
      send_scope_to_token_endpoint: "true",
      client_options: {
        identifier: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        redirect_uri: "https://your.gitlab.com/users/auth/openid_connect/callback"
      }
    }
  }
]

Onelogin の OIDC の SSO ページを確認しながら自分で入力する項目は

  • args.issuer
  • args.client_options.identifier
  • args.client_options.secret
  • args.client.options.redirect_uri

になります

icon, uid_field, pkce は省略しています
特に何も特別なことはしていないのでこれがデフォルトの設定になるかなと思います

動作確認

gitlab を reconfigure してログインページを確認しましょう
設定した OIDC のラベル名でログインボタンが表示されれば OK です

最後に

Gitlab + OIDC のログイン設定方法を紹介しました
今回は Onelogin を使いましたが Onelogin 以外の OIDC でも同じような感じで設定できると思います

参考サイト