Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

posted at

updated at

オレオレ短縮URLアプリ

この記事は、上智大学エレクトロニクス研究部Advent Calendar第15日目の記事です。

背景

短縮URLアプリといえば、bit.ly が有名ですね。当初はこのアプリの無料プランで十分だと思っていたのですが、何度も繰り返し短縮URLを生成するに連れて満足できなくなってきました。特にVS Codeのliveshareのリンクをbit.lyで短縮する際に、毎回別のリンクを生成されてしまうのが不満でした。同じ目的ならば同じリンクになるべきだと考え、固定リンクを使ってみたいと思ったのですが、月額29ドルもかかってしまいます。個人として使うのには(そしてこの目的だけのために使うのには)高すぎると思い、自分で短縮リンクアプリを作ってみることにしました。

使った技術スタック

  • AWS Lambda(API Gateway)
  • AWS DyanmoDB
  • TypeSciprt
  • GitHub Actions

実装

GitHubに載せました。この記事ではその中で一番重要なリダイレクトの部分だけ解説します。

リダイレクト処理の実装について

関数定義(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で管理され、 approvedtrue になると管理者の許可が得られたと判断されます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?