web-dev-qa-db-ja.com

Nodemailer / Gmail-更新トークンとは正確に何で、どのように取得しますか?

nodemailerを使用して、ノードアプリで簡単な連絡先フォームを作成しようとしています。すべてのメッセージを、この目的のために作成したGmailアカウントから個人のメールに送信します。

クライアント側では、顧客の名前/メール/メッセージを取得してサーバーに送信するだけです。ローカルで正常に動作しますが、(heroku btwに)デプロイすると動作しません。

簡単に検索したところ、Google Developers ConsoleからClientIdClientSecretを生成する必要があるようですが、「リフレッシュトークン」の生成に関しては完全に失われています。 。

    var smtpTransport = nodemailer.createTransport("SMTP",{
        service:"Gmail",
        auth:{
            XOAuth2: {
                user:"[email protected]",
                clientId:"",
                clientSecret:"",
                refreshToken:""
            }
        }
    });

混乱しています:更新トークンとは正確に何で、どのように取得しますか?

29
Radioreve

この回答の原作者による注釈:

それで、ようやくそれを理解することができました。 GmailNodemailerとともに使用する必要がある人のために、これに関するリソースがこれ以上見つからなかったことに驚いています

私はここで答えを見つけました: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html

すでにユーザーがあり、うまくいかない場合は、新しいユーザーを作成してみてください。私にとってはそうでした。

これが誰かに役立つことを願っています

乾杯


質問1:更新トークンとは正確には何ですか?

見つかったドキュメントから ここ

更新トークンは、ユーザーがアプリケーションにログインしていない間、アプリがGoogle APIに継続的にアクセスできるようにします。

(...)

考慮事項:

  • コード交換フローを初めて実行するときにのみリフレッシュトークンを取得できるため、リフレッシュトークンを安全かつ永続的に保存してください。

  • 発行される更新トークンの数には制限があります。クライアントとユーザーの組み合わせごとに1つの制限があり、すべてのクライアントでユーザーごとに別の制限があります。アプリケーションが要求する更新トークンが多すぎると、これらの制限に達する可能性があります。その場合、古い更新トークンは機能しなくなります。

オフラインアクセス および 更新トークンの使用 も参照してください。


質問2:どうすれば入手できますか?

ステップ1:OAuth 2.0資格情報 Google Developers Console を取得します

述べたように ここ 、あなたはすべきです:

  1. Google Developers Console に移動します。
  2. プロジェクトを選択するか、新しいプロジェクトを作成します。
  3. 左側のサイドバーで、APIs&authを展開します。次に、APIsをクリックします。 APIセクションの有効なAPIリンクを選択して、有効なすべてのAPIのリストを表示します。 「Gmail API」が有効なAPIのリストにあることを確認してください。有効にしていない場合は、(Google Apps APIの下の)APIのリストからGmail APIを選択し、次にAPIのEnable APIボタンを選択します。
  4. 左側のサイドバーで、Credentialsを選択します。
  5. まだ作成していない場合は、[新しいクライアントIDを作成]をクリックしてプロジェクトのOAuth 2.0認証情報を作成し、資格情報の作成に必要な情報を提供します。

Image from the blog post linked above

  1. それぞれに関連付けられているテーブルでClient IDおよびClient secretを探しますあなたの資格情報の。

Image from the blogpost linked above


PAY SPECIAL ATTENTION TO指定https://developers.google.com/oauthplayground as aリダイレクトURIコンソールで新しいユーザーを作成するとき。そうしないと、エラーが発生します。


ステップ2: Google OAuth2.0 Playground で更新トークンを取得する

  1. Google Oauth2.0 Playground に移動します。
  2. 右上のギアボタンをクリックします。 から取得したクライアントIDおよびClient Secretを設定しますGoogle Developers ConsoleAccess token locationasAuthorization header w/Bearer prefix。この構成オーバーレイを閉じます。

Image from the blogpost above

  1. スコープを設定します。使用する https://mail.google.com/nodemailerが必要とするものです。次に、Authorize APIsボタンをクリックします。

enter image description here

  1. OAuth2.0認証後、認証コードをトークンとvoilá!更新トークンはすぐに使用できます

Image from the blogpost specified above

70
Radioreve

実用的なサンプル/コードスニペットを探し回っている人は、アクセストークンと更新トークンを取得できるまで、Radioreveの回答に従ってください。 (基本的に、遊び場に行き、メールとmail.google.comを送信するためのアクセス権を要求していることを確認し、許可を与え、トークンの認証コードを交換します)

私が入力したexpires時間はnew Date().getTime() + 2000であり、これは遊び場で見られる有効期限の秒数に近いことに注意してください。アクセストークンと有効期限を正確に入力する必要があったかどうかはわかりません。トークンが自動的に更新されているようです。

ECMAScript 6で記述された次のサンプルコードを使用します。

    const user_name     = '[email protected]';
    const refresh_token = '';
    const access_token  = '';
    const client_id     = '';
    const client_secret = '';

    const email_to = '[email protected]';

    const nodemailer = require('nodemailer');

    let transporter = nodemailer
    .createTransport({
        service: 'Gmail',
        auth: {
            type: 'OAuth2',
            clientId: client_id,
            clientSecret: client_secret
        }
    });
    transporter.on('token', token => {
        console.log('A new access token was generated');
        console.log('User: %s', token.user);
        console.log('Access Token: %s', token.accessToken);
        console.log('Expires: %s', new Date(token.expires));
    });
    // setup e-mail data with unicode symbols
    let mailOptions = {
        from    : user_name, // sender address
        to      : email_to, // list of receivers
        subject : 'Hello ✔', // Subject line
        text    : 'Hello world ?', // plaintext body
        html    : '<b>Hello world ?</b>', // html body

        auth : {
            user         : user_name,
            refreshToken : refresh_token,
            accessToken  : access_token,
            expires      : 1494388182480
        }
    };

    // send mail with defined transport object
    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            return console.log(error);
        }
        console.log('Message sent: ' + info.response);
    });
5
Logan