很多时候我们的应用需要获得第三方应用的授权,以此来获得第三方应用的一些资源,比如图片等。获得第三方应用授权的方式有很多种,比如直接将服务商的用户名和密码给第三方应用。
传统的将服务商的用户名密码给第三方应用的授权方式存在的弊端如下:
1.将用户的名户名和密码给了第三方,导致出现了安全问题。
2.如果要收回权限,只能修改密码,但是修改后,也就同时收回了其他的第三方应用的权限。
3.很难安全的实现对不同的第三方应用授予不同的权限,比如让A应用访问相册,让B应用访问日志。
目前流行的获得第三方应用授权的方式是 oauth,目前的版本是2.0 。
oauth协议原理的相关内容可以查看阮一峰老师的文章:
下面我们以人人网的第三方登录平台为例来说明oauth2.0第三方登录的流程。
要实现基于人人网平台的第三方登录,首先需要注册一个人人网的开发者账号。人人网开放平台的地址为:http://dev.renren.com/
点击后出现如下界面:
点击登录,输入自己的账号密码。
点击我的应用,开始创建一个应用。
】
如果你已经创建过应用,这里会显示已经创建的应用列表,如果没有,可以点击右上角的创建应用按钮。
作为测试用,我们可以填写一些测试的名称。
点击创建应用后就可以看到创建应用后的APP ID,API KEY和Secret Key。
然后点击左边的应用信息,注册回调URL。
由于我们是做测试用,所以可以填写测试用的URL:http://localhost:8080/third_login/renren
下面我们就开始用刚才注册的开发者账号来演示基于人人网的第三方登录功能,首先第一步是获取授权码。
访问如下地址:
https://graph.renren.com/oauth/authorize?client_id=XXXXX&redirect_uri=http://localhost:8080/third_login/renren&response_type=code
其中client_id就是我们前面获取到的api_key。
然后在返回的url中,我们就得到了授权码。
得到授权码后,我们就可以用授权码来获取token了。访问如下url:
https://graph.renren.com/oauth/token?grant_type=authorization_code&client_id=d6XXXXX&redirect_uri=http://localhost:8080/third_login/renren&client_secret=14XXXXXXX&code=CjXXXXXXXXX。
其中client_id 就是前面注册时获得的 api key , client_secret 就是 secret key,code就是刚才得到的授权码。访问后,获得token:
最后,我们利用获得的token,可以获得该账号在人人网上的头像的存储地址,让我们访问如下url来获取:
https://api.renren.com/v2/user/login/get?access_token=48XXXXXX,
其中access_token 就是刚才得到的token。
返回的页面如下:
至此,我们就完成了整个人人网开发平台的注册以及获取用户头像的过程。
import os
import json
from flask import Flask, redirect, url_for, session, request, jsonify, Markup
from flask_oauthlib.client import OAuth
RR_APP_ID = os.environ.get('RENREN_APP_ID')
RR_APP_KEY = os.environ.get('RENREN_APP_KEY')
app = Flask(__name__)
app.debug = True
app.secret_key = 'development'
oauth = OAuth(app)
renren = oauth.remote_app(
'renren',
consumer_key=RR_APP_ID,
consumer_secret=RR_APP_KEY,
base_url='https://graph.renren.com',
request_token_url=None,
access_token_url='/oauth/token',
authorize_url='/oauth/authorize'
)
@app.route('/user_info')
def get_user_info():
if 'renren_token' in session:
return redirect(session['user']['avatar'][0]['url'])
return redirect(url_for('login'))
@app.route('/third_login/renren')
def login():
return renren.authorize(callback=url_for('authorized', _external=True))
@app.route('/logout')
def logout():
session.pop('renren_token', None)
return redirect(url_for('get_user_info'))
@app.route('/login/authorized')
def authorized():
resp = renren.authorized_response()
if resp is None:
return 'Access denied: reason=%s error=%s' % (
request.args['error_reason'],
request.args['error_description']
)
session['renren_token'] = (resp['access_token'], '')
# Get openid via access_token, openid and access_token are needed for API calls
if isinstance(resp, dict):
session['user'] = resp.get('user')
return redirect(url_for('get_user_info'))
@renren.tokengetter
def get_renren_oauth_token():
return session.get('renren_token')
if __name__ == '__main__':
app.run()
在Linux 下运行 python test.py
在浏览器中输入http://localhost:8080/third_login/renren
然后会出现人人网的登录界面,输入用户名,密码后,我们就可以拿到用户的头像了。
另外,微博,微信,qq等其他平台的url地址如下,各位网友可自行研究学习:
微信开放平台: https://open.weixin.qq.com/
qq开放平台:http://connect.qq.com/
微博开放平台:http://open.weibo.com/