我有一个渐进式Web应用程序,该应用程序需要对Google Drive API具有写权限,才能在在线时在后台上传用户正在创建的数据(媒体文件)(在线或离线)。它实际上并不需要服务器(除了提供所需文件外,因此静态服务器就足够了),所有工作都可以在Web应用程序客户端完成。
由于上传需要在后台进行,因此每当用户再次联机时(使用服务工作者和后台同步单发API),访问令牌不足以满足我的需要(用户可以脱机/不在线)据我所知,不应将刷新令牌存储在Web应用程序客户端上,而是将刷新令牌存储在Web应用程序客户端上。即使是这样,我仍然需要客户端密码,这意味着我必须使用服务器(或将密码保存在Web应用程序客户端中,这是禁止的),以刷新令牌。
似乎当前使用OAuth2方案的方式与无服务器渐进式Web应用程序不一致,否则我可能会丢失一些东西。在这方面,我认为渐进式Web应用程序更像是Chrome应用程序,但是我必须在Google API控制台中为我的应用程序提供一个Chrome应用程序ID,我没有(也不想这样做),并且Chrome应用程序使用Chrome身份API,用于获取令牌,我不打算使用(也不能)。
我目前正在使用实际的Node.js服务器,该服务器负责授权步骤,将访问令牌和刷新令牌保存在数据库中,并在需要时将现有或新的访问令牌返回给客户端。服务器在这里是多余的(并且我确实不需要存储该数据需要隐私策略),我想使用客户端代码来做所有事情,而不必每次在后台上传时都不断地请求授权。
将刷新令牌保留在Web应用程序客户端上,而只是伸手到服务器上以实际刷新访问令牌(除了客户端机密之外,什么都不需要存储在服务器端),但是就像我提到的那样,我知道不应将刷新令牌保留在Web应用程序一侧。
是否有一种安全可靠的方法来在没有服务器的情况下(或仅从服务器获取刷新令牌并将其返回给客户端并通过从客户端获取刷新令牌来刷新访问令牌的服务器)实现这一目标?>
答案 0 :(得分:0)
实际上非常简单,具体取决于用例的细节。
一个重要的事实是,一旦用户授予了您的应用程序许可,他就不必重新授予它。因此,您不需要“每次在后台上传时都不断要求授权”。但是,唯一的限制是用户必须登录Google才能获得访问令牌。通常这不是问题,但是您的应用需要处理用户从Google注销的情况,并提示登录。
所有详细信息都在这里https://developers.google.com/identity/protocols/OAuth2UserAgent
我建议您避免使用Google JS库,因为(a)它对UX有其自己的见解,(b)编写时并未考虑PWA,(c)在移动设备上存在问题,并且(d)是封闭源因此,当它崩溃(偶尔发生)时,您的用户会陷入困境,直到Google对其进行修复。上面的页面详细介绍了OAuth端点,因此您可以轻松地直接使用它们。这样做的附带好处是,添加其他云存储帐户(AWS,Azure,Drop等)只是更改端点URL的一种情况。
我在PWA中使用的体系结构是使PWA提示一次(并且仅一次)以进行授权,然后将用户的Gmail地址存储在localStorage中。然后我有一个
隐藏的iframe,它使用login_hint
中的gmail地址每小时轮询一次访问令牌。这意味着从不要求iframe呈现任何UX。唯一需要UX的时间是初始身份验证,这是不可避免的,如果用户已经退出Google,则每个会话一次。
您可能要处理的唯一其他情况是允许用户在多个Google帐户(例如个人帐户和工作域帐户)之间进行选择。
从广义上讲,请记住Google并未创建OAuth规范,因此他们几乎无法提供替代解决方案。在抽象级别上,身份验证要求其中一个用户在场,或者是用于永久令牌的安全存储(例如,在服务器上或在安全存储(例如Android)中)。即使我们发明了OAuth 3,情况依然如此。