繁体   English   中英

无状态REST服务器上的Google API回调

[英]Google API Callback on Stateless REST server

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

这完美地工作了,但是在此设置中涉及Google API OAuth2集成时,我处于死胡同。 目标是在Web应用程序中显示用户的日历数据:

  1. 来自在请求标头中提供承载令牌的节点的角度请求/ api / calendars
  2. 如果服务器没有该用户的Google访问令牌,它将创建一个Google令牌请求URL(包括callbackUrl / api / calendars / googleCallback)并将其发送回Angular。
  3. 当Angular收到tokenRequest-Url作为响应而不是日历数据时,它将用户重定向到该URL,在该URL中他手动授予了Webapp许可。
  4. Google重定向到提供访问代码的callback-Url。

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

由于Google仅接受预先指定的固定回调URL,因此无法在回调URL中动态添加某种形式的用于标识用户的哈希值(无论如何似乎都是不安全的)。 我可以将用户标识存储在cookie中,但这感觉像违反了整个JWT方法。

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

谢谢!

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

在令牌查询中使用状态参数,Google会将其路由并附加到回调网址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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM