我有一个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令牌(用于验证)和访问令牌(用于授权)发送到我的服务器吗?
最佳答案 正如你所指出的,我经历了
Authenticate with a backend server.如它所示,可以使用id令牌对后端服务器进行身份验证.这不仅是谷歌推荐的,也是其他一些实体.但是id令牌用于依赖方(客户端)来验证和验证最终用户.访问令牌是应该用于访问资源的令牌.
您可以考虑的另一种方法是使用OpenID Connect规范定义的用户信息端点.
The UserInfo Endpoint is an OAuth 2.0 Protected Resource that returns Claims about the authenticated End-User. To obtain the requested Claims about the End-User, the Client makes a request to the UserInfo Endpoint using an Access Token obtained through OpenID Connect Authentication. These Claims are normally represented by a JSON object that contains a collection of name and value pairs for the Claims.
Google确实提供用户信息端点.他们的documentation’s获取用户配置文件信息sectioon解释了端点,如何调用它以及响应详细信息.
To obtain additional profile information about the user, you can use the access token (which your application receives during the authentication flow) and the OpenID Connect standard:
一个成功的细节将揭示最终用户信息,其格式以People: getOpenIdConnect格式解释.
这样您就可以避免将id令牌暴露给其他方.并且您的后端可以使用访问令牌来访问这些信息,以基于此检测最终用户和authenitcate.
无论这些替代方法如何,id令牌都用于认证.因此,只要您保护id令牌,将其传递给服务器并使用声明来识别最终用户并对令牌有效性进行身份验证就可以了.