この記事は、上智大学エレクトロニクス研究部Advent Calendar第15日目の記事です。
背景
短縮URLアプリといえば、bit.ly が有名ですね。当初はこのアプリの無料プランで十分だと思っていたのですが、何度も繰り返し短縮URLを生成するに連れて満足できなくなってきました。特にVS Codeのliveshareのリンクをbit.lyで短縮する際に、毎回別のリンクを生成されてしまうのが不満でした。同じ目的ならば同じリンクになるべきだと考え、固定リンクを使ってみたいと思ったのですが、月額29ドルもかかってしまいます。個人として使うのには(そしてこの目的だけのために使うのには)高すぎると思い、自分で短縮リンクアプリを作ってみることにしました。
使った技術スタック
- AWS Lambda(API Gateway)
- AWS DyanmoDB
- TypeSciprt
- GitHub Actions
実装
GitHubに載せました。この記事ではその中で一番重要なリダイレクトの部分だけ解説します。
リダイレクト処理の実装について
if (result.Item.public || (await verifySession(sessionId))) {
const location = result.Item.originalUrl.toString();
if (xhr) {
return {
statusCode: 200,
body: JSON.stringify({location}),
headers: httpUtils.toKebabCase({contentType})
};
} else {
return {
statusCode: 302,
body: null,
headers: httpUtils.toKebabCase({location, contentType})
};
}
} else {
if (xhr) {
const session = await checkSessionId(dynamodb, sessionId, linkId);
const setCookie = `session=${session}; Path=/; Max-Age=${maxAge}; HttpOnly${isDev(event) ? "" : "; Secure"}`
return {
statusCode: 403,
body: null,
headers: httpUtils.toKebabCase({contentType, setCookie})
};
} else {
const location = `/link?id=${event.pathParameters.id}`;
return {
statusCode: 302,
body: null,
headers: httpUtils.toKebabCase({location, contentType})
};
}
}
色々書いてありますが、やっていることは、公開リンクならそのままリダイレクトを行う、非公開リンクなら管理者の許可があるまでリダイレクトを行わないということです。
非公開リンクのときに誰に許可を行うのかという判断をするために、 Set-Cookie
を行っています。Cookieの値はDyanmoDBで管理され、 approved
が true
になると管理者の許可が得られたと判断されます。