Auth0 로그를 실시간으로 내보낼 수 있습니다.

Auth0의 로그를 BigQuery를 사용하여 영속화하고 싶었습니다 - Qiita

이 기사에서도 썼던 것처럼 Auth0의 로그 보유기간 Enterprise에서도 30일과 비교적 보유기간이 짧은 것이 목이 되었습니다. 내가 담당하는 프로젝트는 Firebase를 사용하기 때문에,
로그를 정기적으로 API를 사용하여 검색하여 Storage로 내보내고 있습니다.

문득 대시보드를 보면 Logs 안에 Streams라는 기능이 추가되어 있어 보면 AWS의 EventBridge와 Webhook을 사용할 수 있을 것 같아서, 조속히 사용해 보았습니다.

로그 스트림



로그 스트림 - Auth0
HTTP 이벤트 로그 스트림 - Auth0

이 문서를 읽는 것처럼 이벤트가 발생한 시점에서 지정된 Webhook을 호출하므로 이전에 쓴 기사와 같은 onRun() 대신 익숙한 onRequest()를 사용할 수 있습니다. 로그의 내용은 body에 들어오는 사양입니다.

이전 기사에도 썼습니다만, Stackdriver 경유로 Storage 에 export 하고 있기 때문에, 이번은 Stackdriver 에 부딪히는 처리를 이런 느낌으로 써 보았습니다.

utils/logToStackDriverLogging.ts
import { Logging } from '@google-cloud/logging';

interface firebaseEnvConfig {
  databaseURL: string;
  storageBucket: string;
  projectId: string;
}

const firebaseConfigRaw = process.env.FIREBASE_CONFIG as string;
const firebaseConfig: firebaseEnvConfig = JSON.parse(firebaseConfigRaw);

const logToStackDriverLogging = async (payload: any) => {
  const logging = new Logging({
    projectId: firebaseConfig.gcloudProject,
  });

  // NOTE: この辺はお好みで
  const log = logging.log('auth0');
  const metadata = {
    resource: {
      type: 'global',
    },
  };
  const entry = log.entry(metadata, payload);
  await log.write(entry);
};

export default logToStackDriverLogging;

src/logStream.ts
import * as functions from 'firebase-functions';
import * as express from 'express';
import * as bodyParser from 'body-parser';
import logToStackdriverLogging from '../utils/logToStackDriverLogging';

const app = express();
app.use(bodyParser.json());

app.post('/auth0', async (req, res) => {
  res.setHeader('Content-Type', 'text/plain');

  const authorization = req.get('Authorization');
  if (!authorization) {
    console.error('No authorization header');
    res.status(400).json({ success: false });
    return;
  }

  // NOTE: ここはよしなに。
  if (authorization !== functions.config().auth0.token) {
    console.error('Authorization Token missmatch');
    res.status(401).json({ success: false });
  }

  const { body } = req;
  await logToStackdriverLogging(JSON.stringify(body));

  res.status(201).json({ success: true });
});

export const logStream = functions.https.onRequest(app);

Cloud Functions에 배포한 후 Auth0 대시보드에서 Logs → Streams로 이동하여 Custom Webhook을 설정합니다.


이런 식으로 Save.
나머지는 로그인하거나 로그아웃합니다.



나중에 Stackdriver → Storage 내보내기는 이미 설정되어 있으므로 이번에는 설명 생략하지만 제대로 내보내져 있으면 OK입니다.

주의점



받는 쪽의 Webhook가 에러가 되었을 경우, 3회는 Auth0 는 이벤트를 보내 옵니다. 이쪽에서 rerun하는 처리를 생각하지 않아도 좋기 때문에 매우 친절하네요! 반대로 말하면, 에러를 토해 버리는 엔드포인트를 몇번이나 두드리게 될 수 있으므로 주의해 주세요.

If your server is unable to receive the event, we will retry up to three times to deliver the event

그리고 "실시간 내보내기"라고 썼는데 거짓말입니다. 가끔 지연됩니다. 어쩌면 이것은 어떤 서비스에서도 발생할 수 있지만 최선의 노력입니다.

Auth0 does not provide real-time logs for your tenant. While we do our best to index events as they arrive, you may see some delays.

그럼!

좋은 웹페이지 즐겨찾기