Articles of oauth 2.0

OAuth2Client应该创build每个请求或caching每个用户?

我正在使用google api客户端的节点版本。 即: google-api-nodejs-client 。 作为这个的一部分,我设置了oauth-flow( 'google webserver'stream程是确切的。) 作为身份validation的一部分,这包括做如下的调用: var oauth2Client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL); 和 oauth2Client.setCredentials(userSpecificTokens) 显然,第一个调用是特定于应用程序的,而第二个调用是用户特定的。 在这种情况下什么被认为是好的做法? 之一: 每个用户有1个oauth2Client和caching/保存令牌,并在每个请求上使用oauth2Client.setCredentials(userSpecificTokens)注入它们。 这基本上为每个请求创build一个新的oauth2Client 。 每个用户都有一个oauthClient ,包括已经应用的oauth2Client.setCredentials(userSpecificTokens) ,它是在需要时创build的,然后被caching。

使用nodejs应用程序上的刷新和访问令牌了解身份validationstream程

我知道已经有很多关于Oauth,Oauth2,JWT等的post了。我看了很多,而且比以前更加困惑,所以我正在寻求一些解释。 我会提出我对这个问题的看法,希望有人能告诉我,如果我的实施是足够安全的,或者我做错了什么,以及如何改进。 我正在build立一个API Rest服务器,为我的用户提供资源。 假设这是一个银行应用程序,用户可以存款,取款和转账。 我正在使用nodejs,hapijs,jsonwebtokens和bcrypt为我的服务器。 我想实现两个令牌authenticationstream程(Oauth2)。 这是我这样做的方式: 用户通过提供一些凭据(用户名和密码)login到auth服务器。 服务器validation用户的凭证,如果它们是有效的,它将授予对用户的访问并返回刷新令牌和访问令牌。 这些令牌被保存到浏览器或移动设备的本地存储器中。 access token : 被签名为jsonwebtoken。 包含发布date,过期date(5分钟),用户数据(id,用户名)。 refresh token : 被签名为jsonwebtoken并用bcryptencryption。 包含一个唯一标识符 可能包含到期date 保存在数据库中。 只要access token有效,即没有过期并且包含有效的用户数据,资源服务器就为用户提供所请求的资源。 当access token不再有效时,auth服务器请求客户端提供refresh token ,以便发出新的access token 服务器从用户接收refresh token ,对其进行解密,将其与数据库中的refresh token进行比较,检查是否已被吊销,并检查其唯一标识符。 如果refresh token通过所有testing,则服务器向客户端发出一个新的access token 。 如果refresh token一次testing失败,则服务器请求用户重新进行身份validation。 注:我正在尝试避免使用Cookie。 问题: 如果用户能够窃取access token ,我想它也可以窃取refresh token 。 那么,我怎样才能使refresh token更安全呢? Oauth2stream程的观点是否正确? 我可以改进什么? 我错过了什么吗?

redirect_uri的参数值无效:Missing scheme:/ auth / google_auth_code / callback

编辑 : 这是一个最小的可行的项目 我正尝试从服务器端stream的授权代码获取来自Google的访问和刷新令牌。 我遵循Google的指南: https : //developers.google.com/identity/sign-in/web/server-side-flow 。 我正在使用护照和护照-Google-authcode 。 以下是节点应用的路由: router.get('/auth/google_auth_code', passport.authenticate('google_authcode', { scope: [ 'https://www.googleapis.com/auth/calendar', 'profile', 'https://www.googleapis.com/auth/userinfo.email' ] }), function () { res.end(); }) router.get('/auth/google_auth_code/callback', passport.authenticate('google_authcode', { failureRedirect: '/error' }), function (req, res) { // do something with req.user res.send('hello'); } ); 这是该策略的护照configuration。 passport.use('google_authcode', new GoogleAuthCodeStrategy({ clientID: 'my client id', clientSecret: 'my […]

Node Express – 存储和检索authentication令牌

我有一个快速应用程序设置,需要一些关于存储令牌的build议。 在validation用户帐户后,我正在从OAuth 2服务器接收访问令牌,然后我需要为后续的api请求使用该帐户。 我想隐藏来自客户端的令牌值,我相信这样做的一个方法是将令牌保存在服务器中的一个编码的cookie,以便进一步的请求时,这些可以通过中间件路由,然后cookie可以用于检索令牌存储服务器端,然后在正在进行的对实际api端点的请求中用作标题值。 有人实际上已经问过这个问题 – 如何在一个Angular应用程序中存储一个身份validation令牌这正是我在我的应用程序中使用的stream程,但答案谈论使用一个Angular服务,我不太确定我想做到这一点,当然这可以全部由Express处理,所以客户端代码不需要知道令牌,只是API服务器返回的任何错误。 所以我认为我需要stream量总结: 用户提交login凭证 OAuth 2服务器返回访问令牌 令牌被保存在Express中的某个地方 生成一个cookie并将其发送回客户端。 Cookie包含可能编码的令牌值? 或者,也许存储在Express中间件组件中的令牌值的id? 客户端发出api请求,哪个Express路由中间件启动。 快速检查cookie的存在,并解码令牌值,或以某种方式从存储机制服务器端检索。 令牌值然后被用作expression和最终api端点之间的头部 有可能中间件已经在那里处理这种事情,我已经看到PassportJS似乎是我可能要使用的有点东西,但我不太确定它处理我正在工作的服务器上的OAuth2令牌stream反对(密码授予),而是似乎更适合redirectloginOAuthstream量。 我当然需要在某处保存令牌值,所以某种forms的存储(不在内存中,我不认为)。 对于Express,我是相当新的,所以如果能够解决这个问题的话,我会很感激你的build议。 谢谢

Google OAuth2:缺less必需的参数:grant_type

我已经尝试了一切,阅读每个StackOverflowpost在这个问题上,但我仍然无法得到它的工作。 有趣的是,通过DHC REST API客户端(Google Chrome应用程序)发送POST请求时,我能够获得200 OK响应。 var url = 'https://accounts.google.com/o/oauth2/token'; var params = querystring.stringify({ grant_type: 'authorization_code', code: req.body.code, client_id: req.body.clientId, client_secret: 'HIDDEN', redirect_uri: req.body.redirectUri }); params = querystring.unescape(params); // doesn't work with or without string escaping request.post(url + '?' + params, function(error, response, body) { console.log(body); });

Passport.js可选authentication

有没有从Passport.js的可选身份validation中间件? 比方说,我有一个路线, /api/users 。 我只想给公众提供一个用户列表,但是为了validation用户,我想添加更多的字段。 目前我只是一个愚蠢的自定义方法,做同样的事情,但我不知道是否: Passport.js已经提供这样的事情或 我怎么能使这个护照的一部分 ,像一个插件左右。 我的方法大致如下 function optionalAuth(req, res, next) { var authHeader = req.headers.authorization; var token = parseToken(authHeader); // just getting the OAuth token here if(!token) { return next(); } User.findOne({ token: token }, function(err, user) { if(err) { return res.json(401, {message: 'auth expired'}); }; if(user) { req.user = user; […]

如何强制Angular在HTML5模式下向服务器发送请求?

我正在使用angular和nodejs来构build和web。 我在/homepath中加载Angular,其中/包含login和registry单。 这是我的angular度configuration: window.app.config(['$routeProvider', '$locationProvider', function($routeProvider,$locationProvider) { $locationProvider.html5Mode(true); $locationProvider.hashPrefix('!'); $routeProvider. when('/profile', { templateUrl: '/views/account.html', }). when('/edit', { templateUrl: '/views/edit.html', }). when('/home', { templateUrl: 'views/index.html' }). when('/signout', { templateUrl: 'views/signout.html' //on this view i load a controller which submits a form to /signout }). otherwise({ redirectTo: '/home' }); } ]); 在服务器端路由: app.get('/',function(){ res.render('index',{ user: req.user? req.user:'guest' […]

使用Google Contacts API版本3.0和NodeJS的“护照”同步联系人

我正在使用护照,并希望使用Google Contacts API 3.0版将Google通讯录与我的应用程序同步(这会突然变得十倍有用)。 有没有人做到这一点? 如果是这样,你有一些示例代码? 是否有可能使用护照authentication,以使其一切工作?

用Passport和ExpressJS进行Facebook身份validation – 为什么validationcallback没有被调用?

我是Passport在ExpressJS应用程序中对用户进行身份validation。 我试图将所有的Facebook路线放在他们自己的模块中,因为我打算支持其他OAuth提供商。 在我的启动脚本中,我定义了所需的FB端点: var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var facebook = require('./routes/facebook'); var login = require('./routes/login'); var http = require('http'); var path = require('path'); var app = express(); /* Configuration stuff here*/ // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/login', login.index); app.get('/auth/facebook', facebook.fb_auth); app.get('/auth/facebook/callback', facebook.fb_callback); […]

使用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程是什么?