0

REST APIの Jawbone の OAuth2.0 認証に成功した人はいますか?

authorization_codeを取得するためににアクセスして送信する方法がわかりません( Jawbone API Authorization Documentationaccess_tokenのステップ 4 & 5 )。後続の(AJAXスタイルの)呼び出しに再利用し、ユーザーに毎回再認証を求めることを避けたい.access_token

API の各呼び出し ( ) では、 (スクリーン ショット)get.sleepsを取得するために、この再認証を含む認証プロセスの完全なラウンド トリップが必要です。authorization_tokenJawbone とPassportの両方のドキュメントは、この点であいまいです。

ここに画像の説明を入力

私のスタックには、node.jsjawbone-upNPMexpress.jsおよびpassport.js. 有効なデータが返ってきたので、Jawbone の Passport Strategy は正しく機能しているようです。

jawbone-upNPM は明示的にセッション ( access_token) の維持を助けません。

access_token質問: API 呼び出しで実際に OAUTH を使用するにはどうすればよいですか? 誰かがこれを行うためのコードを教えてもらえますか?

ありがとう

var dotenv = require('dotenv').load(),
    express = require('express'),
    app = express(),
    ejs = require('ejs'),
    https = require('https'),
    fs = require('fs'),
    bodyParser = require('body-parser'),
    passport = require('passport'),
    JawboneStrategy = require('passport-oauth').OAuth2Strategy,
    port = 5000,
    jawboneAuth = {
       clientID: process.env.JAWBONE_CLIENT_ID,
       clientSecret: process.env.JAWBONE_CLIENT_SECRET,
       authorizationURL: process.env.JAWBONE_AUTH_URL,
       tokenURL: process.env.JAWBONE_AUTH_TOKEN_URL,
       callbackURL: process.env.JAWBONE_CALLBACK_URL 
    },
    sslOptions = {
        key: fs.readFileSync('./server.key'),
        cert: fs.readFileSync('./server.crt')
    };
    app.use(bodyParser.json());
    app.use(express.static(__dirname + '/public'));
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');

// ----- Passport set up ----- //
app.use(passport.initialize());

app.get('/', 
    passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    })
);

app.get('/done',
    passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    }), function(req, res) {
        res.render('userdata', req.account);
    }
);

passport.use('jawbone', new JawboneStrategy({
    clientID: jawboneAuth.clientID,
    clientSecret: jawboneAuth.clientSecret,
    authorizationURL: jawboneAuth.authorizationURL,
    tokenURL: jawboneAuth.tokenURL,
    callbackURL: jawboneAuth.callbackURL
}, function(token, refreshToken, profile, done) {
    var options = {
            access_token: token,
            client_id: jawboneAuth.clientID,
            client_secret: jawboneAuth.clientSecret
        },
        up = require('jawbone-up')(options);

    up.sleeps.get({}, function(err, body) {
        if (err) {
            console.log('Error receiving Jawbone UP data');
        } else {
        var jawboneData = JSON.parse(body).data;
        console.log(jawboneData);
        return done(null, jawboneData, console.log('Jawbone UP data ready to be displayed.'));
        }
    });
}));
// HTTPS
var secureServer = https.createServer(sslOptions, app).listen(port, function(){
    console.log('UP server listening on ' + port);
});
4

2 に答える 2

0

あなたはそれほど遠くありませんでした.あなたはすでにトークンを手に入れていました. コードを機能させるには、いくつかの手順が必要です。

「セッション」の概念を追加します。これは、リクエストからリクエストまでグローバル変数として存在するデータです。完全な Web アプリを実行するときは、エクスプレス セッションとパスポート セッションを使用し、ユーザー管理を実装します。しかし今のところ、単一のユーザー状態のグローバルを追加するだけです。

var demoSession = {
    accessToken: '',
    refreshToken: ''
};

JawboneStrategy の done() でユーザー オブジェクトを渡します。これは、パスポートの「承認」機能が、ユーザーがセッションに存在することを想定しているためです。承認結果をこのユーザーに添付します。API をテストしているだけなので、空のユーザーを渡すだけです。

// Setup the passport jawbone authorization strategy
passport.use('jawbone', new JawboneStrategy({
    clientID: jawboneAuth.clientID,
    clientSecret: jawboneAuth.clientSecret,
    authorizationURL: jawboneAuth.authorizationURL,
    tokenURL: jawboneAuth.tokenURL,
    callbackURL: jawboneAuth.callbackURL
}, function(accessToken, refreshToken, profile, done) {
    // we got the access token, store it in our temp session
    demoSession.accessToken = accessToken;
    demoSession.refreshToken = refreshToken;
    var user = {}; // <-- need empty user
    done(null, user);
    console.dir(demoSession);
}));

特別なページを使用して、データ "/data" を表示します。サービスの表示から認証を分離するルートを追加します。

app.get('/done', passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    }), function(req, res) {
        res.redirect('/data');
    }
);

最後に、Jawbone Up sleeps API は少しトリッキーです。リクエストに YYYYMMDD 文字列を追加する必要があります。

app.get('/data', function(req, res) {

    var options = {
        access_token: demoSession.accessToken,
        client_id: jawboneAuth.clientID,
        client_secret: jawboneAuth.clientSecret
    };
    var up = require('jawbone-up')(options);

    // we need to add date or sleep call fails
    var yyyymmdd = (new Date()).toISOString().slice(0, 10).replace(/-/g, "");
    console.log('Getting sleep for day ' + yyyymmdd);

    up.sleeps.get({date:yyyymmdd}, function(err, body) {
        if (err) {
            console.log('Error receiving Jawbone UP data');
        } else {
            try {
                var result = JSON.parse(body);
                console.log(result);
                res.render('userdata', {
                    requestTime: result.meta.time,
                    jawboneData: JSON.stringify(result.data)
                });
            }
            catch(err) {
                res.render('userdata', {
                    requestTime: 0,
                    jawboneData: 'Unknown result'
                });
            }

        }
    });
});

あなたのコードに基づいて、ここで私のために働く要点を作成しました: https://gist.github.com/longplay/65056061b68f730f1421

于 2015-07-18T18:50:09.983 に答える
0

Jawbone アクセス トークンは1 年で期限切れになるため、毎回ユーザーを再認証する必要はありません。また、 も提供されてrefresh_tokenいるため、必要に応じてアクセス トークンを更新できます。

取得したらaccess_token、できれば後で使用するために何らかのデータベースまたはファイル ストレージに保存する必要があります。次に、Jawbone REST API に対して行われる各要求に対してそのトークンを使用します。

顎骨アップモジュールはrequestを内部的に使用するため、それを使用してリクエストを作成する方法を示します (他のモジュールとほとんど同じはずです)。

ユーザーのプロファイルを取得する方法は次のとおりです (最も基本的な API 呼び出し)。

var request = require('request')
request.get({
  uri:'https://jawbone.com/nudge/api/v.1.1/users/@me',
  auth:{bearer:'[ACCESS_TOKEN]'},
  json:true
}, function (err, res, body) {
  // body is a parsed JSON object containing the response data
})

Purestと呼ばれる別のモジュールもあります。このモジュールも内部でrequestを使用しますが、REST API の使用に関する複雑さの一部を隠しています。そのモジュールを使用した場合、同じリクエストは次のようになります。

var Purest = require('purest')
var jawbone = new Purest({provider:'jawbone'})
jawbone.get('users/@me', {
  auth:{bearer:'[ACCESS_TOKEN]'}
}, function (err, res, body) {
  // body is a parsed JSON object containing the response data
})

または、ユーザーを認証する (を取得する) ために、私が個人的に使用するGrantaccess_tokenという別のモジュールを使用できますが、どちらも機能するはずです。

于 2015-07-18T14:44:54.723 に答える