import * as validators from "express-validator"; import { App } from "../App"; import { Context } from "../Context"; import * as fw from "../fw"; import BaseController from "./BaseController"; import { URL } from "url"; import { JSDOM } from "jsdom"; import * as resolvers from "../resolvers"; import * as member from "../modules/member"; export default class extends BaseController { constructor(app: App) { super(app); } register(basePath: string) { const router = super.register(basePath); this.registerRoute(router, "POST", "/check", this.check, [ fw.params.InstantValidator([validators.body("url").isString()], (context) => ({ url: context.req.body.url, })), ]); return router; } async index(context: Context) { let url = new URL(this.app.scrapMemberConfig.openIdAuthUrl); for (const [param, value] of Object.entries(this.app.scrapMemberConfig.openIdAuthParams)) { url.searchParams.append(param, value); } return { url: url.href, }; } async check(context: Context) { const reqUrl = context.params.url; const reqUrlObj = new URL(reqUrl); const claimed_id = reqUrlObj.searchParams.get("openid.claimed_id"); if (claimed_id !== null) { // XRDSの取得 const xrdsData = await member.getXrds(claimed_id, this.app.scrapMemberConfig); const xrdsDataDom = new JSDOM(xrdsData); const xrdsUrl = xrdsDataDom.window.document.getElementsByTagName("link"); if (xrdsUrl.length < 1 || !xrdsUrl[0]) { throw new fw.types.InternalServerError("OpenID Discovery Requestの実行に失敗しました。"); } const checkResult = await member.openIdCheckAuth(xrdsUrl[0].href, reqUrl); if (checkResult) { return { result: true, contentUrl: resolvers.contents.resolveUrl("akashic-field-members"), }; } else { return { result: false, }; } } else { throw new fw.types.BadRequest("パラメータのURLが正しくありません。"); } } }