编程崽

登录

一叶在编程苦海沉沦的扁舟之上,我是那只激情自射的崽

Github登录开发

Github登录开发

Github登录第三方网站的功能的开发者验证流程相对来说很简单。

登陆Github后,打开 Setting > Developer setting > OAuth applications,然后点击 Register a new application,创建一个应用程序。

创建时填写一下信息,提交后就能得到一套 clientID 和 clientSecrets。

后面可参照 官方文档 来继续开发,主要流程如下。

跳转登录地址

前端跳转 github 授权登录地址:

sh 复制代码
https://github.com/login/oauth/authorize

使用 ? 和 & 的形式,带入以下参数:

姓名 描述
client_id 必填项注册时从GitHub收到的客户端ID 。
redirect_uri 用户同意授权后跳转的地址,如果不则会直接跳转上一步的 Authorization callback URL 这个地址。请参阅以下有关重定向URL的详细信息。
login 建议用于登录和授权应用程序的特定帐户。
scope 以空格分隔的范围列表。如果未提供,则scope对于未授权该应用程序任何作用域的用户,默认为空列表。对于拥有该应用程序授权范围的用户,不会向用户显示带有范围列表的OAuth授权页面。取而代之的是,流程的这一步将自动完成用户已为应用程序授权的一组作用域。例如,如果用户已经执行了两次Web流程,并已授权一个令牌具有user范围,并且已授权另一个令牌具有repo范围,则不提供的第三个Web流程scope将接收一个具有userandrepo范围的令牌。
state 不可猜测的随机字符串。它用于防止跨站点请求伪造攻击。我用它带个字符串用作标识。
allow_signup 在OAuth流程中,是否向未认证的用户提供注册GitHub的选项。默认值为truefalse当策略禁止注册时使用。

最终,我跳转的链接形式如下:

js 复制代码
let url = `https://github.com/login/oauth/authorize?client_id=${config.clientID}&state=this_is_github`

用户授权登录

跳转地址后,用户同意授权登录,会调至指定的回调地址,同时以 ? 和 & 的形式,把用户 code 和之前传入的 state 带过来。

这个回调地址自然是我们的网站了,我们从 url 中获取 code,用接口传给后台,期望得到用户的个人信息。

注意这个 code 的有效期为10分钟,且只能使用一次。

后台拿到 code,需要做后面这两步。

通过 code 获取用户的 access_token

调用接口:

sh 复制代码
POST https://github.com/login/oauth/access_token

入参如下:

姓名 描述
client_id **必需的。**您从GitHub收到的OAuth应用的客户端ID。
client_secret **必需的。**您从GitHub收到的OAuth应用程序的客户端密码。
code **必需的。**您收到的用户的code。
redirect_uri 授权后将用户发送到应用程序中的URL。
state 您在步骤1中提供的不可猜测的随机字符串。

请求后,会得到类似下面格式的响应:

sh 复制代码
access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer

需要对齐解析,我使用的 npm 自带工具 qs

js 复制代码
// 引入工具
const qs = require('qs')

// 得到相应
let res = 'access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer'
// 解析为对象
let resultObj = qs.parse(res)

可以得到用户的 access_token

通过用户的 access_token 获取用户个人信息

最后这就是最终步骤了,调用以下接口

sh 复制代码
GET https://api.github.com/user

需要添加两个请求头:

js 复制代码
'Authorization': `token ${access_token}`, // access_token 为用户的 access_token
'User-Agent': 'Mozilla/5.0', // User-Agent 的值随便写就行,是github要求必须要有这个请求头的

发送后,就能得到用户的个人信息了。