使用dropboxjs用oauthauthentication客户端2.服务器呢?

我是Oauth和服务器端的新手,所以请耐心等待。

我有一个web应用程序,用dropbox-jsvalidation用户。 一切都很简单。 应用程序使用dropbox-js的client.authenticate函数,如果用户通过身份validation,应用程序会自动redirect到初始页面,在那里执行身份validationcallback。 从那一刻起,我知道我很高兴地使用Dropbox进行身份validation,并且可以使用应用程序的Dropbox目录进行操作。

我有一个公共node.js服务器,目前什么都不做。 我想要做的是:

  • 一旦客户端通过身份validation,请致电我的服务器,并告诉用户已通过身份validation
  • 如果用户不存在于服务器数据库中,则为其创build用户数据库的条目(我不需要详细说明来执行此操作)。 如果存在,则发回用户的相关数据。

我怎样才能以安全的方式做到这一点? 我的意思是,服务器如何告诉用户是一个有效的Dropbox用户? 服务器是否应该使用用户凭证对Dropbox进行身份validation? 这些情况下的工作stream程是什么?

在身份validation过程结束时,您将拥有一个访问令牌,用于调用API。 如果客户端和服务器都需要调用API,那么两者都需要有访问令牌。

如果你今天正在进行身份validation客户端,你可以以某种方式取出访问令牌(不知道是否/如何从库中公开,但它在某处,也存储在本地存储),并将其传递到服务器。 服务器然后可以使用它来调用/account/info并获得authentication用户的Dropbox用户ID。

另一种方法是反过来做。 使用“代码stream”(而不是“令牌stream”)对用户进行身份validation,并首先获取服务器上的访问令牌。 然后,您可以将其传递给客户端,并将其作为Dropbox.Client构造函数中的一个选项传递给客户端。 我认为dropbox-js本身就支持这一点,但这也不难。 以下是一些用于login用户并显示姓名的原始Express代码:

 var crypto = require('crypto'), express = require('express'), request = require('request'), url = require('url'); var app = express(); app.use(express.cookieParser()); // insert your app key and secret here var appkey = '<your app key>'; var appsecret = '<your app secret>'; function generateCSRFToken() { return crypto.randomBytes(18).toString('base64') .replace(/\//g, '-').replace(/\+/g, '_'); } function generateRedirectURI(req) { return url.format({ protocol: req.protocol, host: req.headers.host, pathname: app.path() + '/callback' }); } app.get('/', function (req, res) { var csrfToken = generateCSRFToken(); res.cookie('csrf', csrfToken); res.redirect(url.format({ protocol: 'https', hostname: 'www.dropbox.com', pathname: '1/oauth2/authorize', query: { client_id: appkey, response_type: 'code', state: csrfToken, redirect_uri: generateRedirectURI(req) } })); }); app.get('/callback', function (req, res) { if (req.query.error) { return res.send('ERROR ' + req.query.error + ': ' + req.query.error_description); } // check CSRF token if (req.query.state !== req.cookies.csrf) { return res.status(401).send( 'CSRF token mismatch, possible cross-site request forgery attempt.' ); } else { // exchange access code for bearer token request.post('https://api.dropbox.com/1/oauth2/token', { form: { code: req.query.code, grant_type: 'authorization_code', redirect_uri: generateRedirectURI(req) }, auth: { user: appkey, pass: appsecret } }, function (error, response, body) { var data = JSON.parse(body); if (data.error) { return res.send('ERROR: ' + data.error); } // extract bearer token var token = data.access_token; // use the bearer token to make API calls request.get('https://api.dropbox.com/1/account/info', { headers: { Authorization: 'Bearer ' + token } }, function (error, response, body) { res.send('Logged in successfully as ' + JSON.parse(body).display_name + '.'); }); // write a file // request.put('https://api-content.dropbox.com/1/files_put/auto/hello.txt', { // body: 'Hello, World!', // headers: { Authorization: 'Bearer ' + token } // }); }); } }); app.listen(8000);