0

我们正在运行一个典型的 MEAN 设置 - Angular 用于前端渲染,node.js (express) 作为服务器。静态 HTML/Javascript 资产从节点提供,无需身份验证。前端显示的所有数据都是 Angular 从节点请求的。Angular 通过在 ajax 请求的“授权”标头中提供不记名 JWT 令牌来针对节点端点授权用户。

这非常有效,但是当涉及到此设置中的 Google API OAuth2 集成时,我处于死胡同。目标是在 webapp 中显示用户的日历数据:

  1. Angular 从在请求标头中提供不记名令牌的节点请求/api/calendars
  2. 如果服务器还没有该用户的 Google 访问令牌,它会创建一个 Google 令牌请求 URL(包括 callbackUrl /api/calendars/googleCallback )并将其发送回 Angular。
  3. 当 Angular 收到一个 tokenRequest-Url 作为响应而不是日历数据时,它会将用户重定向到这个 URL,在那里他手动授予 webapp 权限。
  4. Google 重定向到提供访问代码的回调 URL。

问题是第 4 步 - 因为节点服务器是无状态的,并且从 Google 到/api/calendars/googleCallback?code=XYZ的重定向不包含服务器无法识别的授权标头,更不用说验证提供的访问代码所属的用户了。

由于 Google 只接受预先指定的固定回调 URL,因此向回调 URL 动态添加某种标识用户的哈希是行不通的(而且似乎很不安全)。我可以将用户标识存储在 cookie 中,但这感觉就像违反了整个 JWT 方法。

问题是,如果上述流程通常是一个坏主意,或者是否有最佳实践来处理这种情况,以允许后端识别回调请求属于哪个用户。

谢谢!

4

1 回答 1

0

好吧 - 忽略了简单的解决方案:

在令牌查询中使用 Google 路由并附加到回调 URL的状态参数: https ://developers.google.com/accounts/docs/OAuth2Login#state-param

在节点中:

var googleApi = require('googleapis');
var oauth2Client = new googleApi.auth.OAuth2(config.clientId, config.clientSecret, config.callbackUrl);

var options = {
    access_type: 'offline',
    state: 'hashed-useridentified',
    scope: [
        'https://www.googleapis.com/auth/calendar.readonly'
    ].join(' ')
};
oauth2Client.redirectUri_ = 'http://someserver.com/api/auth/google/calendar/callback';
var generatedUrl = oauth2Client.generateAuthUrl(options);
于 2014-11-14T19:58:30.440 回答