Github OAuth 登录开发流程解析

使用 Github Oauth/App 可以为自己的站点添加使用Github 登录的按钮,其中的逻辑十分简单

首先需要创建一个属于自己的Github App,并选择自己所需要的权限,创建app页面的callback板块十分重要,它规定了用户授权app后会跳转过去的地址,同时会在跳转时为该地址上附上code和state参数,记住这一点。

当创建完成后,我们还需要为该app创建一个 client_secret,这个密钥十分重要,在生成后就无法再次查看了,将其保存好,且千万不要将其上传到git仓库中。这个密钥结合app的 client_id,可以用来获取用户的 access_token

接下来的过程就简单了,因为我们已经定义了回调地址,只需要在访问回调地址时,使用链接中的code参数,加上已经保存的 client_secret和 client_id,就可以通过Github的api获取用户的token,并最终通过token去代替用户操作Github

根据上述流程,总结一下从用户点击“Sign in with Github”到登录的全过程:

1,用户点击登录按钮,通过访问后端login地址,重定向至https://github.com/login/oauth/authorize 页面,该页面需要携带参数:

  • client_id:必填,当前app的client_id

  • state:一个自定义参数,可以是任何值,一般用这个参数做合法性校验,以及携带重定向地址等

  • redirect_uri:这个参数就是我们在创建App时填入的Callback url,一定要保证与填写的完全一致,因为github会严格校验,并且无法直接通过该uri携带任何自定义参数,例如redirect_uri=http://x.com?a=1,这样的uri是无效的,只能是http://x.com。所以如果想要携带自定义参数,需要使用state

2,用户在重定向后的Github页面选择授权,github会重定向给定的redirect_uri地址,并且为该地址携带code(Github提供)和state(自己提供)参数

3,跳转redirect_uri页面后,获取地址中的code和state参数,其中code用于访问https://github.com/login/oauth/access_token来获取可用的access_token,state可以用来校验请求是否合法,以及携带一些自定义数据用于登录后的重定向等;

这样成功获取token后,就可以将token用来做任何想做的事了,比如使用302重定向到登录前的页面等。

细节

  • 步骤1中携带的state参数可以用来自定义重定向页面,和其他的自定义数据

  • 如果使用state携带自定义参数,最好使用非对称加密方式加密一下,防止被构造恶意参数,尤其是防止被恶意重定向至其他页面

补充

多个callback URL

使用Github App时可以定义多个callback URL,而Github OAuth应用只能定义一个

如何延长token的有效期

如果创建的是Github App,要注意查看App设置里optional features是否启用了User-to-server token expiration 这一项,启用了这一项代表access_token有效期只有8小时,需要通过refresh_token来刷新新的token,关闭后可以获得正常有效期的access_token。

如何允许访问特定资源

如果需要使用Github App来操作特定的Git仓库内容,那么除了登录步骤外,还需要额外安装App才能进行操作