现在越来越多的网站不再自建登录系统,而是采用第三方登录的方式。比如:QQ、微信、微博、Github等。
其中Github登录是偏技术类网站或新一些的网站的首选,因为它的开放API和生态系统非常强大。
那么如何集成Github登录呢?本文介绍前端主导的Github登录流程。
OAuth2.0 基本概念
Github登录使用的是OAuth2.0协议。OAuth2.0是一个授权框架,允许第三方应用获取对用户资源的有限访问权限。
在OAuth2.0中,主要涉及四个角色:
- 资源所有者(用户)
 
- 客户端(第三方应用)
 
- 授权服务器(Github的OAuth服务)
 
- 资源服务器(Github的API服务)
 
创建Github OAuth应用
- 登录Github,进入Settings -> Developer settings -> OAuth Apps
 
- 点击”New OAuth App”按钮
 
- 填写应用信息:
- Application name:应用名称
 
- Homepage URL:应用主页URL
 
- Application description:应用描述(可选)
 
- Authorization callback URL:授权回调URL
 
 
- 创建完成后,你会获得Client ID和Client Secret
 
注意:Client Secret 是非常重要的,一定不能放在前端,千万不要泄露给任何人!
前端实现
1. 发起授权请求
1 2 3 4 5 6 7 8 9 10 11
   | const clientId = 'your_client_id'; const redirectUri = 'your_redirect_uri'; const scope = 'read:user user:email'; 
  function redirectToGithub() {   const authUrl = `https://github.com/login/oauth/authorize?client_id=${clientId}&redirect_uri=${redirectUri}&scope=${scope}`;   window.location.href = authUrl; }
 
  document.getElementById('github-login').addEventListener('click', redirectToGithub);
   | 
 
2. 处理回调
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   |  async function handleCallback() {   const code = new URLSearchParams(window.location.search).get('code');   if (!code) return;
    try {          const response = await fetch('/api/github/callback', {       method: 'POST',       headers: {         'Content-Type': 'application/json'       },       body: JSON.stringify({ code })     });
      const data = await response.json();     if (data.access_token) {              localStorage.setItem('github_token', data.access_token);       await fetchUserInfo(data.access_token);     }   } catch (error) {     console.error('Github登录失败:', error);   } }
  async function fetchUserInfo(token) {   try {     const response = await fetch('https://api.github.com/user', {       headers: {         'Authorization': `token ${token}`       }     });     const userInfo = await response.json();     console.log('用户信息:', userInfo);        } catch (error) {     console.error('获取用户信息失败:', error);   } }
 
  document.addEventListener('DOMContentLoaded', handleCallback);
 
  | 
 
服务端实现
服务端主要负责处理Github OAuth的核心流程,主要是code换取token必须在服务端进行。用express框架做一个简易示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   |  const express = require('express'); const axios = require('axios'); const app = express();
 
  const clientId = process.env.GITHUB_CLIENT_ID; const clientSecret = process.env.GITHUB_CLIENT_SECRET;
  app.post('/api/github/callback', async (req, res) => {   const { code } = req.body;      try {          const tokenResponse = await axios.post('https://github.com/login/oauth/access_token', {       client_id: clientId,       client_secret: clientSecret,       code: code     }, {       headers: {         Accept: 'application/json'       }     });
      const { access_token } = tokenResponse.data;
           res.json({       access_token,     });
    } catch (error) {     console.error('Github OAuth Error:', error);     res.status(500).json({       error: '授权失败'     });   } });
 
  app.listen(3000, () => {   console.log('Server is running on port 3000'); });
 
  | 
 
服务端注意事项
安全存储
- Client Secret必须安全存储,推荐使用环境变量
 
- 用户token要加密存储在数据库中
 
 
Token管理
- 实现token过期和刷新机制
 
- 定期清理无效token
 
 
错误处理
 
并发控制
 
最佳实践
错误处理:实现完善的错误处理机制,为用户提供清晰的错误提示。
 
Loading状态:在授权过程中显示loading状态,提升用户体验。
 
Token管理:合理管理access token的存储和刷新机制。
 
用户体验:提供清晰的登录按钮和流程提示。
 
总结
Github OAuth登录的实现并不复杂,关键是要理解OAuth2.0的基本流程,注意安全性问题,并做好错误处理和用户体验优化。通过以上步骤,你就可以为你的应用添加Github登录功能了。
本文主要介绍的是重前端的方式来实现这个,但真实项目中这些事项更应该放在服务端进行,后续有机会再分享重服务端的实现。