Python:OAuth2第三方登录之Github

简介: Python:OAuth2第三方登录之Github

一、应用登记

https://github.com/settings/applications/new


登记完成后,获取两个参数


客户端 ID(client ID)

客户端密钥(client secret)

二、GitHub登录授权

1、网站让用户跳转到 GitHub。


GET https://github.com/login/oauth/authorize?
    client_id=7e015d8ce32370079895&
    redirect_uri=http://localhost:8080/oauth/redirect

两个参数:


client_id告诉 GitHub 谁在请求

redirect_uri是稍后跳转回来的网址

2、 GitHub 用户登录授权,重定向回网站,同时返回【授权码code】。


GET http://localhost:8080/oauth/redirect?
    code=859310e7cecc9196f4af

3、 网站后台使用授权码,向 GitHub 请求【令牌】, 需要加json请求头


POST https://github.com/login/oauth/access_token
Accept: application/json
参数:
client_id:客户端的 ID
client_secret:客户端的密钥
code:授权码

三、请求数据

网站使用令牌,向 GitHub 请求用户数据。


GET https://api.github.com/user
Authorization: Bearer {access_token}
Accept: application/jso

代码实现

依赖requirements.txt


requests
flask
environs
mo-cache

run.py


# -*- coding: utf-8 -*-
from urllib.parse import urljoin
from flask import Flask, request, url_for
from github_api import get_github_auth_url, user, get_access_token
from mo_cache import FileCache
from environs import Env
# 注册应用获取的参数
env = Env()
env.read_env()
clientID = env.str('clientID')
clientSecret = env.str('clientSecret')
# 使用文件缓存 access_token
cache = FileCache()
ACCESS_TOKEN_KEY = 'access_token_key'
app = Flask(__name__)
def full_url_for(endpoint, **values):
    """获取完整路径"""
    return urljoin(request.host_url, url_for(endpoint, **values))
@app.route('/')
def hello_world():
    """首页暴露接口地址"""
    return {
        'auth_url': full_url_for('get_auth_url'),
        'get_user': full_url_for('get_user')
    }
@app.route('/auth_url')
def get_auth_url():
    """获取由后端拼接的Github第三方登录授权地址"""
    redirect_uri = full_url_for('oauth_redirect')
    auth_url = get_github_auth_url(client_id=clientID, redirect_uri=redirect_uri)
    return {'auth_url': auth_url}
@app.route('/oauth/redirect')
def oauth_redirect():
    """github验证回调地址,从请求参数中获取code"""
    code = request.args.get('code')
    # 拿到code后继续请求获取access_token
    res = get_access_token(client_id=clientID, client_secret=clientSecret, code=code)
    # 存储用户的access_token
    access_token = res.get('access_token')
    cache.set(ACCESS_TOKEN_KEY, access_token)
    return res
@app.route('/user')
def get_user():
    """通过access_token 获取用户信息"""
    # 从缓存中取出
    access_token = cache.get(ACCESS_TOKEN_KEY)
    res = user(access_token=access_token)
    return res
if __name__ == '__main__':
    print(app.url_map)
    # 服务地址需要和应用配置一致
    app.run(port=8080, debug=True)

github_apipy


# -*- coding: utf-8 -*-
import requests
def get_github_auth_url(client_id, redirect_uri):
    """
    :param client_id: 告诉 GitHub 谁在请求
    :param redirect_uri: 跳转回来的网址
    :return:
    """
    authorize_uri = 'https://github.com/login/oauth/authorize'
    return f'{authorize_uri}?client_id={client_id}&redirect_uri={redirect_uri}'
def get_access_token(client_id, client_secret, code):
    """获取 access_token 此操作在后台完成"""
    url = 'https://github.com/login/oauth/access_token'
    params = {
        'client_id': client_id,
        'client_secret': client_secret,
        'code': code
    }
    headers = {
        'accept': 'application/json'
    }
    res = requests.post(url=url, params=params, headers=headers)
    return res.json()
def user(access_token):
    """获取用户信息"""
    url = 'https://api.github.com/user'
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    res = requests.get(url=url, headers=headers)
    return res.json()

相关文章
|
5月前
|
数据采集 编解码 算法
Github | 推荐一个Python脚本集合项目
Github | 推荐一个Python脚本集合项目
109 5
|
5月前
|
算法 数据处理 数据安全/隐私保护
|
5月前
|
数据采集 数据可视化 Ruby
GitHub星标破万!Python学习教程(超详细),真的太强了!
Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 Python 的设计哲学之一就是简单易学,体现在两个方面: 1. 语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。 2. 切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
|
5月前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。
|
5月前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。 今天给小伙伴们分享的这份Python数据分析入门手册本着实用性的目的,着眼于整个数据分析的流程,介绍了从数据采集到可视化的大致流程。
|
5月前
|
SQL 安全 网络安全
GitHub点赞飙升!电信大牛的Python渗透测试实战指南
在网络安全领域,会不会编程,是区分“脚本小子”和真正黑客的关键。实际的渗透测试中会遇到各种复杂的网络环境,常用工具不一定能满足需求,这时就需要对现有工具进行扩展,或者编写符合要求的工具、自动化脚本,这都需要一定的编程能力。在分秒必争的 CTF 竞赛中,想要高效地使用自制脚本工具来达成各种目的,更是需要有编程能力。 Python 这两年越来越火!除了语法简单、开发效率高以外,Python 最大的优势就是拥有超多第三方库。很多有名的网络安全工具和安全系统框架都是用 Python 开发的!所以,掌握 Python 编程已经成为网络安全从业者的必备技能之一。如果你想成为一名合格的安全从业者,就不能只会
爆赞!GitHub首本Python开发实战背记手册,标星果然百万名不虚传
Python (发音:[ 'paiθ(ə) n; (US) 'paiθɔn ] n. 蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。 Python 语言的特点:
|
6月前
|
人工智能 数据挖掘 大数据
爆赞!GitHub首本标星120K的Python程序设计人工智能案例手册
为什么要学习Python? Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Pytho
|
6月前
|
分布式计算 数据可视化 大数据
阿里云大牛熬夜整理的Python大数据小抄,GitHub星标125K!
Python 是一种流行的编程语言,在大数据领域有广泛的应用。Python 拥有丰富的库和工具,可用于数据处理、分析和可视化。 在大数据处理方面,Python 可以与 Hadoop、Spark 等大数据框架集成,实现大规模数据的处理和分析。它也适用于数据清洗、数据转换、数据挖掘等任务。 此外,Python 的数据分析库如 Pandas、NumPy 和 Matplotlib 等,提供了强大的数据处理和可视化功能,使得数据分析变得更加简单和高效。
|
6月前
|
分布式计算 数据可视化 大数据
阿里云大牛熬夜整理的Python大数据小抄,GitHub星标125K!
Python 是一种流行的编程语言,在大数据领域有广泛的应用。Python 拥有丰富的库和工具,可用于数据处理、分析和可视化。 在大数据处理方面,Python 可以与 Hadoop、Spark 等大数据框架集成,实现大规模数据的处理和分析。它也适用于数据清洗、数据转换、数据挖掘等任务。 此外,Python 的数据分析库如 Pandas、NumPy 和 Matplotlib 等,提供了强大的数据处理和可视化功能,使得数据分析变得更加简单和高效。

热门文章

最新文章