Nat*_*les 25 authentication github github-api oauth-2.0
我的雇主要求我使用用户的 GitHub 帐户为我们的 Web 应用程序实现一个登录系统。我在网上查了一下,但无法找到如何使用 GitHub 帐户(而不是 Facebook 或 Google 帐户)执行此操作的明确说明。
Nat*_*les 42
我刚刚花了大约一周的时间来弄清楚如何做到这一点,所以我想我应该写一个解释来节省未来开发人员的时间。
\n您需要遵循GitHub 文档中的本指南(“授权 OAuth 应用程序”),并添加一些内容(如下所述)以使其能够作为用户身份验证的方法。
\nusers数据库表,其想法是用于登录的每个 GitHub 帐户都会在此表中拥有自己的相应行。\nusers:\nid - INTEGER\nemail - VARCHAR\nname - VARCHAR\ngithub_id - VARCHAR\nRun Code Online (Sandbox Code Playgroud)\noauth_tokens数据库表来存储我们的后端从 GitHub 接收的所有 GitHub 访问令牌的副本。\noauth_tokens:\nid - INTEGER\nuser_id - INTEGER\naccess_token - VARCHAR\nexpires_at - DATETIME\nrefresh_token - VARCHAR\nrefresh_token_expires_at - DATETIME\ndevice_code - VARCHAR <-- Used for the "device flow". I have the back-end send the\n front-end the device code immediately upon starting the device flow, and I then\n have the front-end poll the back-end with it until the back-end has received\n the access token from GitHub, at which point the front-end discards the device\n code and uses the access token as its authentication token.\nRun Code Online (Sandbox Code Playgroud)\nlocalStorage如果您希望用户即使在关闭登录的浏览器选项卡后仍保持登录状态,则前端应存储令牌。x-updated-access-token。如果刷新令牌失败,它将中止请求并发送 401 响应,前端将其视为将用户重定向到登录页面的信号。\n
axios.ts。这是我放置代码的地方,该代码将 GitHub 访问令牌添加到我们应用程序后端的所有请求(如果前端在 localStorage 中找到这样的令牌),以及查看来自的任何响应的代码我们的应用程序的后端查看访问令牌是否已刷新。access_tokenlocalStorage 变量(这表明用户已经登录),但没有找到,因此将用户重定向到 /login 路由。\nApp.vue:mounted()和App.vue:watch:authenticated()statelocalStorage 变量,然后使用我们应用的客户端 ID 和随机变量作为 URL 查询参数将用户重定向到 GitHub 的 OAuth 应用授权页面state。\nLogin.vue:redirectUserToGitHubWebAppFlowLoginLink()state变量与其存储在 localStorage 中的内容相匹配,如果是这样,它会将授权代码 POST 到我们的后端。\nApp.vue:mounted()和App.vue:sendTheBackendTheAuthorizationCodeFromGitHub()auth.py:get_web_app_flow_access_token_and_refresh_token()access_token在 localStorage 中设置一个变量,并将authenticatedVue 变量设置为true,应用程序会不断监视该变量,并触发前端将用户从“登录”视图重定向到“ app”视图(即应用程序中要求用户进行身份验证的部分)。\nApp.vue:sendTheBackendTheAuthorizationCodeFromGitHub()和App.vue:watch:authenticated()access_tokenlocalStorage 变量(这表明用户已经登录),但没有找到,因此将用户重定向到 /login 路由。\nApp.vue:mounted()和App.vue:watch:authenticated()Login.vue:startTheDeviceLoginFlow()auth.py:get_device_flow_user_code()user_code.user_code。user_code和 的响应。device_codeuser_code它将和存储device_code在 Vue 变量中。\nLogin.vue:startTheDeviceLoginFlow()device_code也会保存到 localStorage 中,这样,如果用户关闭打开“登录”页面的浏览器窗口,然后打开一个新页面,则无需重新启动登录过程。user_code向用户显示 。\nLogin.vue模板代码块中的开头<div v-if="deviceFlowUserCode">user_code(它将在新选项卡中打开页面)。device_code来设置deviceFlowDeviceCode变量。应用程序中代码的一个单独部分不断检查该变量是否已设置,当它发现已设置时,它开始轮询后端以查看后端是否已从access_tokenGitHub 接收到 Yet。 \nLogin.vue:watch:deviceFlowDeviceCode()和Login.vue:repeatedlyPollTheBackEndForTheAccessTokenGivenTheDeviceCode()https://github.com/login/device登录其 GitHub 帐户时输入用户代码,无论是在运行此应用程序的同一设备上还是在其他设备(例如手机)上。access_token和refresh_token,并且如在描述“Web 应用程序流程”时提到的,向 GitHub 的“/user”端点发送请求以获取用户数据,然后获取或创建用户数据库记录,然后创建新的oauth_tokens数据库记录。\nauth.py:_repeatedly_poll_github_to_check_if_the_user_has_entered_their_code()access_token设置一个access_token变量,将用户重定向到“app”视图(即部分要求用户进行身份验证的应用程序的名称)。\nLogin.vue:repeatedlyPollTheBackEndForTheAccessTokenGivenTheDeviceCode()| 归档时间: |
|
| 查看次数: |
5563 次 |
| 最近记录: |