我想构建小型应用程序。会有一些用户。我不想创建自己的用户系统。我想将我的应用程序与oauth / oauth2.0集成。
我的前端应用程序和oauth 2.0的集成没有问题。有很多有用的文章,如何做到这一点,甚至在stackoverflow.com上。例如,this post非常有帮助。
但是。成功授权前端后我该怎么办?当然,我可以在客户端上标记“好吧,伙计,用户已经过身份验证”,但我现在应该如何与我的后端进行交互?我不能只提出一些要求。后端 - 一些提供API函数的应用程序。每个人都可以访问此API。
所以,我的FE和BE之间需要一些auth系统。这个系统应该如何运作?
ps我有一些英语问题,可能我不能正确'问谷歌'。你能提供正确的问题吗:)或者至少提供一些关于我的问题的文章。
我正在寻找概念。我不想为我当前的问题找到一些解决方案。我不认为我使用FE和BE是什么问题(无论如何我会 提供以下信息)
FE和BE将使用JSON进行通信。 FE将发出请求,BE将发送JSON响应。我的应用程序将具有这种结构(可能):
也许像google.com,vk.com,twitter.com等“服务提供商”会记得用户状态?在FE成功验证后,我可以询问BE的用户状态吗?
答案 0 :(得分:19)
创建API时,我们有3个主要的安全问题。
身份验证:像Google这样的识别提供商只是部分解决方案。由于您不希望提示用户为每个API请求登录/确认其身份,因此您必须自己为后续请求实施身份验证。您必须存储,可供后端访问:
授权:您的后端必须根据用户ID(这是您自己的业务)实施规则。
传输安全性:HTTPS和过期的Cookie是安全的,不会被其他人重播。 (HTTPS正在加密流量,因此会破坏中间人攻击,并且过期的Cookie会在稍后的时间内阻止重播攻击)
因此,您的API /后端有一个随机字符串的电子邮件查找表。现在,您不必公开用户的ID。该令牌毫无意义且是暂时的。
以下是此系统中流程的工作原理:
User-Agent IdentityProvider (Google/Twitter) Front-End Back-End
|-----------------"https://your.app.com"---------->|
|---cookies-->|
your backend knows the user or not.
if backend recognizes cookie,
user is authenticated and can use your API
ELSE:
if the user is unknown:
|<--"unknown"-|
|<----"your/login.js"----------+
"Do you Authorize this app?"
|<------------------+
|--------"yes"----->|
+----------auth token--------->|
|<---------/your/moreinfo.js---|
|-------access_token ---------->|
1. verify access token
2. save new user info, or update existing user
3. generate expiring, random string as your own API token
+----------->|
|<-------------- set cookie: your API token --------------------|
现在,用户可以直接使用您的API:
|--------------- some API request, with cookie ---------------->|
|<-------------- some reply, depends on your logic, rules ------|
修改强>
根据讨论 - 补充说后端可以通过使用身份提供者验证访问令牌来验证用户身份:
例如,Google exposes this endpoint来检查令牌XYZ123
:
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
答案 1 :(得分:6)
我仔细阅读了所有答案,超过一半的回复者完全错过了这个问题。 OP要求FE和amp;之间的INITIAL连接。 BE,在服务提供商发出OAuth令牌之后。
您的后端如何知道OAuth令牌有效?请记住,您的BE可以向服务提供商发送请求&amp;确认您的FE首次收到的OAuth令牌的有效性。此OAuth密钥只能由服务提供商解密,因为只有它们具有密钥。一旦他们解密密钥,他们通常会回复用户名,电子邮件等信息。
总结:
用户授权后,您的FE会从服务提供商处收到OAuth令牌。 FE将OAuth令牌传递给BE。 BE将OAuth令牌发送到服务提供商以验证OAuth令牌。服务提供商使用用户名/电子邮件信息响应BE。然后,您可以使用用户名/电子邮件创建帐户。
然后在您的BE创建帐户后,您的BE应该生成自己的OAuth令牌实现。然后,您向FE发送此OAuth令牌,并且在每次请求时,您的FE都会将此标记发送到您的BE。由于只有您的BE具有验证此令牌的密钥,因此您的应用程序将非常安全。您甚至可以在每次请求时刷新BE的OAuth令牌,每次都会为您的FE提供一个新密钥。如果有人从您的FE窃取OAuth令牌,该令牌将很快失效,因为您的BE已经为您的FE创建了新的OAuth令牌。
有关您的BE如何验证OAuth令牌的更多信息。 How to validate an OAuth 2.0 access token for a resource server?
答案 2 :(得分:3)
嗯,你的前端不需要用户系统。 前端只是一种与服务器交互的方式,并通过有效的用户和密码请求令牌。
您的服务器应该管理用户和权限。
用户登录方案
用户通过输入用户名和密码来询问令牌。 服务器API接受请求,因为它是匿名方法(如果他登录或不登录,每个人都可以无需小心地调用此方法。
服务器检查数据库(或某些存储)并将用户详细信息与他拥有的详细信息进行比较。 如果细节匹配,服务器将向用户返回令牌。
从现在开始,用户应该将此令牌设置为任何请求,以便服务器识别该用户。 令牌实际上包含用户角色,时间戳等...
当用户通过API请求数据时,它会从标头中获取用户令牌,并检查是否允许用户访问该方法。
这就是它的一般工作方式。
我在答案中基于.NET。但大多数BE库都是这样的。
答案 3 :(得分:2)
正在进行SSO项目并根据我对您的问题的理解,我可以建议您在后端创建一个终点来生成会话,一旦客户端-frontend-成功获得了帐户所有者,并从提供程序获取用户信息,您将该信息发布到后端端点,后端端点生成会话并存储该信息,并发送回会话ID - 经常用cookie命名为jSessionId-回到客户端-frontend-所以浏览器可以为你保存它,之后每个请求都被认为是经过身份验证的用户。
要注销,只需在后端创建另一个端点即可接受会话ID,以便后端可以将其删除。
我希望这对你有所帮助。
答案 4 :(得分:1)
让我们使用OAuth概念开始,这里的FE是客户端,这里的BE是资源服务器。
您可能会问,什么是访问令牌,授权服务器发出访问令牌,授予客户端,资源服务器识别。
访问令牌是一个字符串,表示授权信息(例如用户信息,权限范围,到期时间......)。
为了安全起见,访问令牌可能已加密,您应该确保资源服务器可以对其进行解密。
有关详细信息,请阅读OAuth2.0规范https://tools.ietf.org/html/rfc6749。
答案 5 :(得分:1)
您需要将令牌存储在应用程序的状态中,然后在每次请求时将其传递给后端。传递到后端可以在标题,cookie或params中完成 - 取决于后端的实现方式。
按照代码查看所有动作片段的好例子(不是我的代码) 此示例设置Authorization:Bearer TOKEN标头 https://github.com/cornflourblue/angular-registration-login-example