可以将 OAuth 访问令牌传递给客户端吗
Is it ok to pass OAuth access tokens to the Client
我对 Web 开发还是很陌生 我自己完成了 Web Development with Node and Express by Ethan Brown 目前我正在努力更好地理解 Full-Stack React Projects by Shama Hoque.
给出的示例
目前我正在尝试重构很多过去在服务器端呈现的东西,以便在 React SPA 客户端中处理。其中之一包括一个简单的 GitHub 小部件,我之前的流程是这样的:
- 客户端用户使用 GitHub OAuth 应用程序向我的服务器进行身份验证。
- 服务器将返回给回调的访问令牌存储在服务器上的数据库中。
- 服务器使用存储在数据库中的用户访问令牌调用GitHubAPI。
- 服务器处理结果,在HTML中呈现并发送给客户端。
不过我意识到也可以这样实现。
- 客户端用户使用 GitHub OAuth 应用程序向我的服务器进行身份验证。
- 服务端将回调返回的access Token传回给客户端
客户端使用从服务器获得的用户访问令牌调用GitHubAPI。
客户端 处理结果并适当地呈现它。
据我所知,这样做没有固有的安全风险(当 oAuth 提供程序以任何一种方式重定向到回调时,恶意用户可能会拦截访问令牌)并且这两种流程都有其优缺点(例如,第二个流程在服务器上产生较少的负载但也会牺牲控制)。因为我是新手,所以我自己想出了第二个流程,我想仔细检查一下这是否可以做,或者我错过了什么,如果是的话,我错过了什么?还有其他我没有考虑的主要缺点或优点吗?
您实施的是 OAuth Authorization Flow。在此流程中,客户端(又名浏览器)从不 获取访问令牌。只有您的网络服务器才能获取它。因此客户端无法调用资源服务器 (github)。您的网络服务器代表客户端进行调用。
你说:
a malacious user could interecept the access token when the oAuth provider redirects to the callback either way
但是,如果您正确实施流程,则事实并非如此。这是因为一旦你与资源服务器进行身份验证,它只会给浏览器一个身份验证code。这个 code 只是一张临时票,可以用来交换访问令牌。但是,要为访问令牌交换代码,您必须知道客户端机密。只有您的网络服务器知道这个秘密。所以你的浏览器将代码发送到你的服务器,你的服务器用代码+秘密调用资源服务器(github)来获取令牌。
您描述的第二个流程是 OAuth Implicit Flow。
这个流程与您描述的非常相似:用户通过资源服务器进行身份验证后,浏览器以访问令牌结束并直接调用资源服务器。
这两种流程都很常见。隐式流程的安全性稍差,因为坏人有更多机会访问浏览器内存(或本地存储或 cookie 存储)中的令牌。授权流程更安全一些,因为令牌保留在您的服务器上,您不必依赖用户来保证它的安全。
我对 Web 开发还是很陌生 我自己完成了 Web Development with Node and Express by Ethan Brown 目前我正在努力更好地理解 Full-Stack React Projects by Shama Hoque.
给出的示例目前我正在尝试重构很多过去在服务器端呈现的东西,以便在 React SPA 客户端中处理。其中之一包括一个简单的 GitHub 小部件,我之前的流程是这样的:
- 客户端用户使用 GitHub OAuth 应用程序向我的服务器进行身份验证。
- 服务器将返回给回调的访问令牌存储在服务器上的数据库中。
- 服务器使用存储在数据库中的用户访问令牌调用GitHubAPI。
- 服务器处理结果,在HTML中呈现并发送给客户端。
不过我意识到也可以这样实现。
- 客户端用户使用 GitHub OAuth 应用程序向我的服务器进行身份验证。
- 服务端将回调返回的access Token传回给客户端
客户端使用从服务器获得的用户访问令牌调用GitHubAPI。
客户端 处理结果并适当地呈现它。
据我所知,这样做没有固有的安全风险(当 oAuth 提供程序以任何一种方式重定向到回调时,恶意用户可能会拦截访问令牌)并且这两种流程都有其优缺点(例如,第二个流程在服务器上产生较少的负载但也会牺牲控制)。因为我是新手,所以我自己想出了第二个流程,我想仔细检查一下这是否可以做,或者我错过了什么,如果是的话,我错过了什么?还有其他我没有考虑的主要缺点或优点吗?
您实施的是 OAuth Authorization Flow。在此流程中,客户端(又名浏览器)从不 获取访问令牌。只有您的网络服务器才能获取它。因此客户端无法调用资源服务器 (github)。您的网络服务器代表客户端进行调用。
你说:
a malacious user could interecept the access token when the oAuth provider redirects to the callback either way
但是,如果您正确实施流程,则事实并非如此。这是因为一旦你与资源服务器进行身份验证,它只会给浏览器一个身份验证code。这个 code 只是一张临时票,可以用来交换访问令牌。但是,要为访问令牌交换代码,您必须知道客户端机密。只有您的网络服务器知道这个秘密。所以你的浏览器将代码发送到你的服务器,你的服务器用代码+秘密调用资源服务器(github)来获取令牌。
您描述的第二个流程是 OAuth Implicit Flow。
这个流程与您描述的非常相似:用户通过资源服务器进行身份验证后,浏览器以访问令牌结束并直接调用资源服务器。
这两种流程都很常见。隐式流程的安全性稍差,因为坏人有更多机会访问浏览器内存(或本地存储或 cookie 存储)中的令牌。授权流程更安全一些,因为令牌保留在您的服务器上,您不必依赖用户来保证它的安全。