oauthの大枠について、いい感じに理解したので、覚えているうちにアウトプットしておく

まあ、経験的にもわかると思うけど、新しくemailを登録してそこに確認メールを送って、認証する、っていうやつ、あれやっぱり面倒くさくて、CVR下げるのよね。ってことで、やっぱりgoogleとかLINEとかを使った認証のほうが圧倒的に楽なわけですわ。ポチってしまうわけですわ。これ、自分のアプリに組み込むことで圧倒的にユーザを確保できると思うんですよね。ってことで、

仕組み

大事なのは、どのフェーズにおいても、URLそのものに重要な情報を乗っけてやり取りしてるってこと。 まず、ユーザがログインページでgoogleによる認証をクリックしたとするよね。これはゲットリクエストなわけですわ。このgetリクエストに対して、サーバはユーザをgoogleの認証サーバにリダイレクトするわけです。 で、リダイレクトのurlの中にこのサイトの情報が乗ってるんですよね、サイトのIDってやつです。 このIDは事前にgoogleのdeveloperサイトでもらえます。google側はこのIDでどのサイトかを判別しているんですね。更にこのサイトでコールバックのURL (ユーザがgoogle側にこのアプリに情報を送ることを承認するボタンを押したあとにリダイレクトされるURL) も登録しておきます。 で、ユーザが承認すると、コールバックのURLにユーザの情報にアクセスするためのトークンを乗っけてこっちにリダイレクトされるわけですわ。 で、そのトークンを使って、ユーザの情報にアクセスできるようになるわけです。

ただ、自分でメール認証の仕組みを作るのも重要だとは思っている。

これの作り方、そんなにむずくないよね。 まず、ユーザにメールアドレスを入力してください。ってお願いするわけです。 で、入力されたメールアドレスに、このサイトのurlと/auth/mail/{random} みたいなのを入れておくわけですわ。randomっていうのが、そのメールアドレスと一時的に紐付けられているランダムな値です。で、ユーザが/auth/mail/{random}にアクセスしてきたら、まあ、実際にそのメールアドレスがあったんやなってわかるわけですわ。まあなんでもいいよ、mail2uuid := map[string]stringとかで管理しているやつと

for k,v := range m {
    if v == uuid {
        // そのイーメールアドレスを認証する、って感じです。
        // このときにcookieを入れておくといいですね。ええ。
        // cookieとemailを紐付けるのを忘れないように。
        // useridとパスワードを入力するページにリダイレクトします。
        // って感じです。はい。
    }
}

これ、有効期間決めておいたほうがいいですね。数分とかそんな感じで。

ちなみに、golangからemailを送信する一番いい方法なんだけど、

やっぱり、リレーするのがいいみたいです。ええ。 chatGPTに出してもらったコードがこちらですね。

package main

import (
    "net/smtp"
    "log"
)

func main() {
    // Sender and recipient email addresses.
    from := "your_email@gmail.com"
    to := "recipient@example.com"

    // SMTP server configuration.
    smtpServer := "smtp.gmail.com"
    smtpPort := "587"
    smtpUsername := "your_email@gmail.com"
    smtpPassword := "your_email_password"

    // Compose the email message.
    subject := "Hello, Golang Email!"
    body := "This is a test email sent from a Golang application."

    // Define the SMTP server's authentication information.
    auth := smtp.PlainAuth("", smtpUsername, smtpPassword, smtpServer)

    // Create the email message.
    msg := "Subject: " + subject + "\r\n" +
        "To: " + to + "\r\n" +
        "From: " + from + "\r\n\r\n" +
        body

    // Send the email.
    err := smtp.SendMail(smtpServer+":"+smtpPort, auth, from, []string{to}, []byte(msg))
    if err != nil {
        log.Fatal(err)
    }

    log.Println("Email sent successfully!")
}

決済の方法についてもいくつかあると思うので、まとめておきたい。

まずは、どの決済を組み込むかなんだけど、まあ普通に paypayとpaypalとまああとはクレジットカードでいいかね。 そうね、ユーザにポイントを付与する感じにするか。 1シミュレーション100ポイントとかにしてとかにして、って感じかね。 実際に購入画面に進むためには500ポイントとかにして。1000ポイント買うと、200ポイントおまけでついてくる、とかにしてね。

ちなみに、3,4,5,6,7(5) * 10 * 12 = 通り 強弱をつけて5万円くらいかな

実際の運用ではおそらく常に認証サーバがcookieの認証をしてくれている。おそらくね

いや、そんなことはないのか?いや、している気がするんだよね。むしろ絶対にしてるでしょ。 でもわざわざ別のインスタンスとしてたてるのももちろんもったいないんですよね。 だから、どうにかして、モノリシックにしたところではあるのですが。