简介
以下内容主要介绍oauth2的认证流程及授权实验操作方法,具体oauth的授权方式有几种,下面主要是描述授权码的方式
oauth2客户端授权模式之授权码的实现流程图(authorization code)
+----------+| Resource || Owner || |+----------+ ^ | (B)+----|-----+ Client Identifier +---------------+| -+----(A)-- & Redirection URI ---->| || User- | | Authorization || Agent -+----(B)-- User authenticates --->| Server || | | || -+----(C)-- Authorization Code ---<| |+-|----|---+ +---------------+ | | ^ v (A) (C) | | | | | | ^ v | |+---------+ | || |>---(D)-- Authorization Code ---------' || Client | & Redirection URI || | || |<---(E)----- Access Token -------------------'+---------+ (w/ Optional Refresh Token)备注: (A), (B), (C) 这三步被拆成两段,因为会经过 user-agent Figure 3: Authorization Code Flow
搭建django工程
pip install django-oauth-toolkit
具体的环境配置(requriement.txt)
Django (1.9.4)django-oauth-toolkit (0.10.0)
后面的配置可以直接通过官方的说明进行操作
认证授权的流程介绍
注册application
访问下面的地址,进行新application的注册,这个步骤也可以通过脚本直接生成,也可以通过后台页面生成
注册通过之后,可以拿到对于的client_id和client_secret,已经注册的时候定义的redirect_url
获取Authorization Code
通过GET方式,请求如下地址:
http://192.168.66.96:8000/o/authorize?response_type=code&client_id=7tZU8b56I28VbUjWXMCFQBuJqEgFrfU1j9x8nGae&redirect_uri=http://www.baidu.com
response_type表示回调授权的方式,这里是code
client_id是刚刚生成的id
redirect_url是刚刚注册填写的授权url地址
认证服务(django-oauth-toolkit)会回调刚刚参数中的redirect_url,刚刚填写的是www.baidu.com,自然他会去回调这个url地址,然后带上code参数。
回调成功之后,生成的code也会在admin后台的Grants表里面记录
但是这个code有几个特点
-
只能使用一次
-
时效性只有10分钟有效时间
获取Access Token
通过POST方式,请求方法如下面代码
# coding=utf8import requestsimport jsonurl = 'http://192.168.66.96:8000/o/token/'s = requests.Session()var = {'grant_type':'authorization_code', 'code':'uJxN3b90YHjx3fgXkfjnqXgCrku8xY', 'redirect_uri':'http://www.baidu.com', 'client_id':'7tZU8b56I28VbUjWXMCFQBuJqEgFrfU1j9x8nGae', 'client_secret':'2EoIS2NYpI2gX1UZadXBuY1mXUtJkwRGvBjRAzRYTDLu4glUNcd1WEh7bbMgMKdBvX3YfE3Jsi9578OV8UYrllR5iS5SYlFDG6wHXoIAXBsB9A3XFswpYi8uXre2oB5g', }r = s.post(url=url,data=var)print r.text
成功获取到的数据如下:
{ "access_token": "ofOLKAY4SJthtCmeX0P5KZXuXRyUgN", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "nzuPk7HDlYHHUwYRW0OsnT1eA6q6cQ", "scope": "read write groups"}
如果成功获取到认证token,Grants中的code会被删除,Access tokens表会生成最新的access token