8

我正在尝试使用 Python 和 Falcon Web 框架通过社交平台(Github、Facebook、Instagram)为带有登录选项的 RESTfull API 实现 OAuth2 服务器。但我一直在努力理解这件事应该如何运作。

我目前的理解使我想到了以下方案: OAuth2 授权方案(使用社交平台)

1.1。在 API 方面,我正在创建一个端点/auth/login/github,它基本上会告诉移动应用程序将客户端重定向到 Github.com 授权页面 - github.com/login/oauth/authorize 1.2。在 Github 授权页面上,用户将看到以下屏幕: Github授权页面 1.3。按下授权后,用户将callback使用新授予的临时授权码进入参数(Github OAuth 服务配置)中指定的页面。在我的情况下,URL 将如下所示:my.api.com/auth/callback/github?code=AUTH_CODE

2.1。收到回调请求后,我正在解析/提取传递的授权码并从后端查询 Github.com 以兑换授权码并获取访问令牌(使用我的客户端 ID客户端密钥发送POST 请求github.com/login/oauth/access_token) 2.2。如果一切顺利,Github 将使用Access Token回复我的 POST 请求,我可以使用它来获取用户个人资料详细信息(例如电子邮件)

3.1。现在我知道通过 Github 的授权是成功的(因为我收到了用户的电子邮件),我可以向该用户授予我自己的访问令牌,这样他就可以查询我的 API 端点。我只是通过添加随机生成的OAuth2 令牌并将其插入到我的数据库中来做到这一点,同时通过使用深层链接(例如:myapp://token)将用户重定向到移动应用程序来将相同的令牌返回给用户。3.2. 最后,移动应用程序可以通过向每个请求添加以下标头来查询我的 API 端点Authorization: Bearer 0b79bab50daca910b000d4f1a2b675d604257e42

这有意义吗?这是对 RESTfull API 进行社交授权的正确方法吗?

我使用Falcon作为该项目的 Web 框架,使用Authlib作为 OAuth2 库。

4

2 回答 2

3

它肯定是一种方式。而且看起来还不错。

我将使它更简单,也许它有点清楚发生了什么。

1.1 [手机APP] 将用户重定向到github.com/oauth/authorize?client_id=CLIENT_ID您在github注册的客户端ID

1.2 [Mobile APP] 用户通过重定向来fancy.app/callback/github?code=AUTH_CODE(这是您在 github 上配置的回调 url)
1.2.1 [Mobile APP] 使用 AUTH_CODE 调用您的 API 端点

1.3 【API】通过github确认AUTH_CODE有效。

到目前为止,我们已经进行了用户身份验证;用户不是随机的人,是 github.com 上的用户 xxx,并且您有您要求的信息。

现在,如果你需要在你的 API 上授权这个用户,在 1.3 之后:

1.3.1 [API] 生成令牌
1.3.2 [API] 将令牌存储在某个持久存储中
1.3.3 [API] 为令牌定义一些过期时间(实际上来自 github 的 AUTH_CODE 应该有一些过期时间,使用它)
1.3 .4 【API】返回token给手机APP

我们生成的这个令牌是移动应用程序用来在 API 上对用户进行身份验证的令牌;不再调用 github(至少在到期之前)。

于 2018-10-16T23:59:34.297 回答
1

1.1。在 API 方面,我正在创建一个端点 /auth/login/github ,它基本上会告诉移动应用程序将客户端重定向到 Github.com 授权页面 - github.com/login/oauth/authorize

与其硬编码/auth/login/github,不如将其作为 API 上的查询参数,以便您可以快速集成单独的 OAuth2 提供程序(Google、Facebook 等)

您的端点 URL 现在看起来像这样/auth/login/?provider=github,您的后端可以为移动应用程序提供正确的重定向 URL。这意味着您可以简单地为 Facebook 添加新按钮/auth/login/?provider=facebook,这将是最少的工作。

当您收到回调请求时,该 URL 可能类似于my.api.com/auth/callback/?provider=github&code=AUTH_CODE. 您可能还想在自己的数据库中插入一条新的用户记录(如果有的话),因此您可以在需要时提示输入额外信息,例如,我会在 Django 中执行此操作,因为我需要在数据之上提供额外信息由第三方 OAuth2 提供商提供。

总的来说,这种方法看起来很合理。

于 2018-10-18T15:30:52.123 回答