我正在尝试使用Python和Falcon网络框架通过社交平台(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 ID 和 Client Secret 发送POST请求到github.com/login/oauth/access_token
)
2.2。如果一切顺利,Github将使用访问令牌回复我的POST请求,我可以使用该令牌获取用户个人资料详细信息(例如电子邮件)
3.1。现在,我知道通过Github的授权是成功的(因为我收到了用户的电子邮件),因此我可以为该用户授予我自己的访问令牌,这样他就可以查询我的API端点。我只是通过添加随机生成的 OAuth2令牌并将其插入我的数据库中,同时通过使用深层链接(例如:myapp:// token)将用户重定向到移动应用程序,同时将相同的令牌返回给用户,来完成此操作。
3.2。最后,移动应用可以通过向每个请求Authorization: Bearer 0b79bab50daca910b000d4f1a2b675d604257e42
这有意义吗,这是对RESTfull API进行社交授权的正确方法吗?
答案 0 :(得分:2)
肯定是一种方法。而且看起来还不错。
我将使其变得更简单,也许正在发生的事情有点清楚。
1.1 [移动APP]使用您在github注册的客户端ID将用户重定向到github.com/oauth/authorize?client_id=CLIENT_ID
1.2 [移动APP]用户通过重定向到fancy.app/callback/github?code=AUTH_CODE
(这是您在github上配置的回调URL)来实现
1.2.1 [移动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]将令牌返回到移动APP
我们生成的此令牌是移动APP将用来在API上对用户进行身份验证的令牌;没有进一步调用github(至少到到期为止)。
答案 1 :(得分: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提供程序提供。
总体而言,这种方法看起来不错。