我有一个SPA应用程序,它由rest api服务器支持。
我使用Auth0使用隐式授权流进行身份验证和授权
我读到的所有示例都说明我应该将我收到的访问令牌发送到api以进行授权。例如:
https://auth0.com/blog/why-should-use-accesstokens-to-secure-an-api
另一方面,我读到访问令牌不能用作身份验证的证明:
http://www.thread-safe.com/2012/01/problem-with-oauth-for-authentication.html
https://oauth.net/articles/authentication/
这意味着,我不能相信我的访问令牌上的子声明,以确保这确实是用户而不是另一个发送其访问令牌的客户端。 这意味着,如果我使用Facebook作为IDP,另一个Web应用程序可以发送一个访问令牌,由用户发送给我的服务器,并且因为访问令牌没有aud声明,我的服务器会认为用户已经过身份验证在我的网络应用程序中 此外,我看到谷歌登录确实引导水疗中心向服务器发送了一个ID令牌:https://developers.google.com/identity/sign-in/web/backend-auth
所以:我应该将id令牌(用于验证)和访问令牌(用于授权)发送到我的服务器吗?
答案 0 :(得分:1)
正如您所指出的,我经历了 Authenticate with a backend server 。如它所示,可以使用id令牌对后端服务器进行身份验证。这不仅是谷歌推荐的,也是其他一些实体。但是id令牌用于依赖方(客户端)来验证和验证最终用户。访问令牌是应该用于访问资源的令牌。
您可以考虑的另一种方法是使用OpenID Connect规范定义的用户信息端点。
UserInfo端点是OAuth 2.0受保护资源,它返回有关经过身份验证的最终用户的声明。为了获得有关最终用户的请求声明,客户端使用通过OpenID Connect身份验证获得的访问令牌向UserInfo端点发出请求。这些声明通常由JSON对象表示,该对象包含声明的名称和值对的集合。
Google确实提供了用户信息端点。他们的documentation's 获取用户个人资料信息 sectioon说明了端点,如何调用它以及响应详细信息。
要获取有关用户的其他配置文件信息,您可以使用访问令牌(应用程序在身份验证流程中收到的访问令牌)和OpenID Connect标准:
一个成功的细节将揭示最终用户信息,其格式以 People: getOpenIdConnect 格式解释。
这样可以避免将id令牌暴露给其他方。并且您的后端可以使用访问令牌来访问这些信息,以便根据该信息检测最终用户和authenitcate。
无论这些替代方法如何,都将使用id令牌进行身份验证。因此,只要您保护id令牌,将其传递给服务器并使用声明来识别最终用户并对令牌有效性进行身份验证就可以了。