用于 RESTful API 的带有社交网络的 Python OAuth2 服务器

Posted

技术标签:

【中文标题】用于 RESTful API 的带有社交网络的 Python OAuth2 服务器【英文标题】:Python OAuth2 server with social networks for a RESTfull API 【发布时间】:2019-03-19 07:17:12 【问题描述】:

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

我目前的理解使我想到了以下方案:

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

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

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

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

我使用Falcon 作为这个项目的网络框架,Authlib 作为 OAuth2 库。

【问题讨论】:

【参考方案1】:

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

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

1.1 [Mobile 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,并且您有您要求的信息。

现在,如果您需要在 1.3 之后在您的 API 上授权此用户:

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

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

【讨论】:

【参考方案2】:

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 提供商提供。

总的来说,这种方法看起来不错。

【讨论】:

以上是关于用于 RESTful API 的带有社交网络的 Python OAuth2 服务器的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebRequest 连接限制和 RestFUL 服务器

使用 MEAN.js Restful 无会话 API 后端的 Oauth 社交登录

RESTful Web 服务 + Spring Security:带有访问令牌的 API 服务?

使用 JWT 保护用于验证客户端的 RESTful API

实施具有自己的登录系统(无社交媒体)的 RESTful Web 应用程序时是不是需要 OAuth?

理解 RESTful API 设计规范