requests库入门-15-OAUTH认证

来源:互联网 发布:淘宝生意怎么做大做强 编辑:程序博客网 时间:2024/05/21 14:09

           前面一篇文章,我们知道了HTTP中的基本认证机制,我们知道基本认证还是不是很安全,这篇介绍另外一种认证机制,OAUTH认证,现在最新应该是2.0版本。那么什么是Oauth认证呢?其实,我们几乎每天都在使用这个认证登录不同app或者网站。例如,现在csdn网站支持QQ登录和微信登录,这个就使用到了OAUTH认证机制。因为,我们前面一直在拿githua网站举例,这里也不例外,下面这个例子,能够帮助你理解OAUTH认证的过程。

先看看OAUTH整个认证过程图解


1. 支持用github账号登录的网站

打开一个国内网站,https://coding.net/,点击登录,可以看到支持github账号登录。

       我用我的github账号,可以看到coding.net给github发送了一个请求,需要请求github上我个人的一些用户数据,点击授权登录,就可以用github账号登录coding.net网站。下面我们为了用python中的requests库来演示这个OAUTH授权登录过程,我们来简化一下,手动在github上设置一个不会变化的token。

2.在github上设置一个token

       浏览器登录github网站,点击头像下的setting按钮,进入到设置页面。下拉底部,点击菜单 Developer settings ->Personal access tokens,点击生成一个私人的访问token链接。我们在新页面,随意给一个token描述,例如输入demo,勾选user这个区域,也就是让这些信息可以被OAUTH授权的程序去获取。点击绿色的生成token按钮。

我们把这个token复制下来,先保存到一个记事本里面。

3.Python requests代码实现

import requestsBase_Url = 'https://api.github.com'def build_uri(end_point):    return '/'.join([Base_Url, end_point])def oauth_auth():    headers = {'Authorization': 'token 83e4eaf55e1b5afaff0e825695422afb0d41ee1e'}    # 获取user/email信息    response = requests.get(build_uri('user/emails'), headers=headers)    print(response.status_code)    print(response.text)    print(response.request.headers)oauth_auth()
运行结果:

200[{"email":"anxxxxx@msn.com","primary":true,"verified":true,"visibility":"public"}]{'User-Agent': 'python-requests/2.18.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'token 83e4eaf55e1b5afaff0e825695422afb0d41ee1e'}
       这个Oauth和HTTP基本认证对比,是不是感觉安全很多。因为整个请求过程下来,没有涉及到用户的密码和用户的账号。服务器只是给了对方一个token code。当前,在实际x项目过程中,这个token是一个变量,这个变量的获取,可能需要登录接口的response内容得到。

4.利用面向对象思维重构代码

       我们观察上面代码,是不是有觉得token是一个变量,而我们在程序代码里把这个给写死了。有时候,我们需要把这个token作为一个变量使用,所有,我们需要把上面代码重构一下,方便更好调用。

import requestsfrom requests.auth import AuthBaseBase_Url = 'https://api.github.com'def build_uri(end_point):    return '/'.join([Base_Url, end_point])class GithubAuth(AuthBase):    def __init__(self, token):        self.token = token    def __call__(self, r):        # 给request 添加headers        r.headers['Authorization'] = ' '.join(['token', self.token])        return rdef oauth_request_advance():    auth = GithubAuth('83e4eaf55e1b5afaff0e825695422afb0d41ee1e') # 我们想要替换一个别的token,这样就非常方便    response = requests.get(build_uri('user/emails'), auth=auth)    print(response.text)oauth_request_advance()




原创粉丝点击