现在很多站点都支持第三方登录功能
作为一个技术博客, 目标受众项是一批程序员, 第三方登录的就选中了 github
这篇文章注意是讲一讲如何给自己的博客添加 github 自动登录功能
OAuth 2.0
说到第三方登录, 不得不提的一个知识点就是 oauth 2.0
OAuth(开放授权) 是一个开放标准, 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源 (如照片, 视频, 联系人列表), 而无需将用户名和密码提供给第三方应用 ---- 百度百科
这个协议在认证和授权的时候涉及到:
服务提供方, 例如 GitHub,GitHub 上储存了用户的登录名, Email, 昵称, 头像等信息
用户
客户端, 例如我的博客就是一个客户端, 需要服务方向我提供用户的一些基本信息
OAuth 协议的认证和授权的过程如下:
用户打开我的博客后, 我想要通过 GitHub 获取改用户的基本信息
在转跳到 GitHub 的授权页面后, 用户同意我获取他的基本信息
博客获得 GitHub 提供的授权码, 使用该授权码向 GitHub 申请一个令牌
GitHub 对博客提供的授权码进行验证, 验证无误后, 发放一个令牌给博客端
博客端使用令牌, 向 GitHub 获取用户信息
GitHub 确认令牌无误, 返回给我基本的用户信息
如何使用 GitHub 提供的 OAuth 服务
打开 Setting > Developer setting > OAuth applications
点击 Register a new application
填入基本的 app 信息
创建成功, 会有如下页面
image
这里的各项配置具体的作用, 我们还是看一看 GitHub 提供的文档 OAuth GitHub Developer Guide
具体流程
转跳到 GitHub 用户授权页面, client_id 必须传
其他参数如果有需要就传, 例如我这里需要获取用户的邮箱信息, 就加了一个 scope=user:email
最终拼成的 URL 如下:
https://github.com/login/oauth/authorize?client_id=myclient_id&scope=user:email
当用户同意授权后, 链接地址就会转跳到 我们配置页面内的 Authorization callback URL 所填写的 URL 地址, 并且会带上一个 code 参数, 这个参数在后面获取用户 token 是必须的一个参数
获取到这个 code 参数后, 我会将这个 code 传到服务器的后台, 然后后台调用
https://github.com/login/oauth/access_token
这个 api, 传入 client_id, client_secret, code 这三个参数, 可以获取到一个 access_token
获取到 access_token 后, 再调用
https://api.github.com/user?access_token=access_token
这个 API, 就可以获取到基本的用户信息了 用户的基本信息内容如下所示, 根据第一步传入的不同的 scope, 获取到的用户信息也是不同的博客后台使用 login 字段作为用户的唯一标示, 因为 email 可能为空, 之前用 email 发生了一些 bug
- {
- "login": "Diamondtest",
- "id": 28478049,
- "avatar_url": "https://avatars0.githubusercontent.com/u/28478049?v=3",
- "gravatar_id": "","url":"https://api.github.com/users/Diamondtest","html_url":"https://github.com/Diamondtest","followers_url":"https://api.github.com/users/Diamondtest/followers","following_url":"https://api.github.com/users/Diamondtest/following{/other_user}","gists_url":"https://api.github.com/users/Diamondtest/gists{/gist_id}","starred_url":"https://api.github.com/users/Diamondtest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Diamondtest/subscriptions","organizations_url":"https://api.github.com/users/Diamondtest/orgs","repos_url":"https://api.github.com/users/Diamondtest/repos","events_url":"https://api.github.com/users/Diamondtest/events{/privacy}","received_events_url":"https://api.github.com/users/Diamondtest/received_events","type":"User","site_admin": false,"name": null,"company": null,"blog":"",
- "location": null,
- "email": null,
- "hireable": null,
- "bio": null,
- "public_repos": 0,
- "public_gists": 0,
- "followers": 0,
- "following": 0,
- "created_at": "2017-05-06T08:08:09Z",
- "updated_at": "2017-05-06T08:16:22Z"
- }
这样, 从获取授权, 到获得用户信息的流程就走完了 再根据自己的需求进行用户信息储存, 自有登录的接入, 用户资料的管理就完成了一套第三方登录的方案
目前市面上主流的协议就是 OAuth2.0 例如 QQ, 微信, 微博等等 所以只要搞明白大概流程, 那么接入其他供应商的第三方登录也是小菜一碟了
来源: http://www.jianshu.com/p/78d186aeb526