在前端使用OAuth成功验证后如何与后端进行交互?

时间:2015-11-22 21:13:24

标签: angularjs oauth oauth-2.0 frontend backend

我想构建小型应用程序。会有一些用户。我不想创建自己的用户系统。我想将我的应用程序与oauth / oauth2.0集成。

我的前端应用程序和oauth 2.0的集成没有问题。有很多有用的文章,如何做到这一点,甚至在stackoverflow.com上。例如,this post非常有帮助。

但是。成功授权前端后我该怎么办?当然,我可以在客户端上标记“好吧,伙计,用户已经过身份验证”,但我现在应该如何与我的后端进行交互?我不能只提出一些要求。后端 - 一些提供API函数的应用程序。每个人都可以访问此API。

所以,我的FE和BE之间需要一些auth系统。这个系统应该如何运作?

ps我有一些英语问题,可能我不能正确'问谷歌'。你能提供正确的问题吗:)或者至少提供一些关于我的问题的文章。

UPD

我正在寻找概念。我不想为我当前的问题找到一些解决方案。我不认为我使用FE和BE是什么问题(无论如何我会 提供以下信息)

FE和BE将使用JSON进行通信。 FE将发出请求,BE将发送JSON响应。我的应用程序将具有这种结构(可能):

  • 前端 - 可能是AngularJS
  • 后端 - 可能是Laravel(laravel将实现逻辑,结构中也有数据库)

也许像google.com,vk.com,twitter.com等“服务提供商”会记得用户状态?在FE成功验证后,我可以询问BE的用户状态吗?

6 个答案:

答案 0 :(得分:19)

创建API时,我们有3个主要的安全问题。

  1. 身份验证:像Google这样的识别提供商只是部分解决方案。由于您不希望提示用户为每个API请求登录/确认其身份,因此您必须自己为后续请求实施身份验证。您必须存储,可供后端访问:

    1. 用户的ID。 (取自身份提供者,例如:电子邮件)
    2. 用户令牌。 (您生成的临时令牌,可以从API代码验证)
  2. 授权:您的后端必须根据用户ID(这是您自己的业务)实施规则。

  3. 传输安全性:HTTPS和过期的Cookie是安全的,不会被其他人重播。 (HTTPS正在加密流量,因此会破坏中间人攻击,并且过期的Cookie会在稍后的时间内阻止重播攻击)

  4. 因此,您的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