Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8875

【nodemailer】お前らのOAuth2は間違っている

$
0
0

・はじめに

個人開発でGmailを使おうとしたのですが、「安全性の低いアプリをブロックしました(ドヤッ」って通知&設定の自動変更がウザかったのでOAuth2を導入しました。その過程で「gmailのOAuth2認証をnodemailerからちゃんと通したい」だけなのに結構回り道をしたので忘備録です。

まあ実はnodemailer公式ドキュメント読めば秒で解決するけど公式ドキュメント読まない人もいるからね。仕方ないね。(ブーメラン


ちなみにGoogleさんからIDとかシークレットとかリフレッシュトークンを取得する方法についてはnode.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送るが一番詳しいと思います。それ以前にOAuthって何ぞやって人は各自ググってください。要はTwitterのアレです。




・よくないかもしれない実装

maybeBadExample.js
varnodemailer=require('nodemailer')// メッセージvarmessage={from:'送信元',to:'送信先',subject:'タイトル',text:'本文'};// 認証情報varauth={type:'OAuth2',user:'ユーザ名@gmail.com',clientId:'クライアントID',clientSecret:'クライアントシークレット',refreshToken:'リフレッシュトークン'};// トランスポートvartransport={service:'gmail',auth:auth};vartransporter=nodemailer.createTransport(transport);transporter.sendMail(message,function(err,response){console.log(err||response);});

Node.jsでGmailからメールをOAuth認証で送信する方法から引用
↑晒しあげるのは流石にどうかと思ったけど「nodemailer gmail oauth2」で検索すると2番目に出てくるので責任は重い。恨むならGoogleを恨んで




var使ってるとかそういうのは本筋じゃないのでさて置くとしても、このコードをそのまま流用してmodule.exportなりrequire()なりすると間違いなくGoogleさんに怒られます。

というのも後半のnodemailer.createTransport()これはOAuth認証を通すメソッドなのですが、これだとリクエストの度に新しいアクセストークンを要求してしまいます。アクセストークン自体は発行してから30分ほど有効なので、まあ軽い気持ちで都度都度新しいトークンを要求したらGoogleさんも当然オコですよね。衛宮士郎かよ。


でまあ対策としてはnodemailer.createTransport()で作成したインスタンスを適当な場所にキャッシュしておきましょう。あとは引数とかrequire()とかグローバル変数で渡せばOK

実はnodemailer君、最初に一回createTransport()してしまえばアクセストークンの管理は全部自動でやってくれますイェイ!優秀!!!



一応コード例としてクラス内でcreateTransport()した例を置いておきます。

Authed.js
classAuthed{constructor(){letnodemailer=require('nodemailer');this.transporter=nodemailer.createTransport({host:'smtp.gmail.com',port:465,secure:true,// SSLauth:{type:'OAuth2',user:'送信元アドレス',clientId:'クライアントID',clientSecret:'シークレット',refreshToken:'リフレッシュトークン'}});}}module.exports=newAuthed();





ちなみに呼び出し側はこんな感じ、require()がキャッシュを持つ仕様を利用してOAuth認証済みのインスタンスを呼び出してます。

// メッセージvarmessage={from:'送信元',to:'送信先',subject:'タイトル',text:'本文'};lettransporter=require("./Authed").transporter;transporter.sendMail(message,function(err,response){console.log(err||response);});




・まとめ

つまり何が言いたいんだってばよって結論を3行でまとめると
・nodemailer.createTransport()は一回でOK
・アクセストークンはnodemailerが隠蔽してくれる
・公式ドキュメント読め

って感じです。

というかOAuthの仕組みを知ってれば、アクセストークンが一切出てこない時点で違和感あると思うんですけどどうなんでしょうね。今回の調べ物を通して、やはりいくらフレームワークが便利だとはいえ、その前提知識は必要なんだなって思いを新たにした次第です。

ちなみに個人開発の進捗ですが、こんなお気持ちポエム書いてるぐらいには順調です。9月にはクローズドベータ、10月にはリリースの予定なのでもうしばらくお待ちください。

それではまた次回


Viewing all articles
Browse latest Browse all 8875

Trending Articles