rauth/flask:如何通过Twitter登录?

rauth/flask:如何通过Twitter登录?,flask,twitter-oauth,rauth,Flask,Twitter Oauth,Rauth,rauth中提供的是使用PIN而不是回调。我不明白如何通过网络回调来工作 1)小问题: 根据twitter的说法,如果传入了oauth\u callbackURL,那么应该使用设置中的任何条目。但是,如果我不将其设置为http://127.0.0.1:8080/twitter/authorized成功授权后,它将永远无法访问该Url app.add_url_rule('/twitter/login', view_func=views.twitter_login) app.add_url_ru

rauth中提供的是使用PIN而不是回调。我不明白如何通过网络回调来工作

1)小问题:

根据twitter的说法,如果传入了
oauth\u callback
URL,那么应该使用设置中的任何条目。但是,如果我不将其设置为
http://127.0.0.1:8080/twitter/authorized
成功授权后,它将永远无法访问该Url

app.add_url_rule('/twitter/login', view_func=views.twitter_login)  
app.add_url_rule('/twitter/authorized', 'twitter_authorized', view_func=views.twitter_authorized)

def twitter_login():
    request_token, request_token_secret = twitter.get_request_token()
    redirect_uri = url_for('twitter_authorized', _external=True)
    params = {'oauth_callback': redirect_uri, 'request_token':request_token}
    return redirect(twitter.get_authorize_url(**params))
2)主要问题在这里:

我可以看到request.args既有
['oauth\u-token']
又有
['oauth\u-verifier']
。 但我不明白如何使用它们获取twitter会话,以获取用户详细信息,如图片和显示名称:

def twitter_authorized():
    tw_session = twitter.get_auth_session(request_token ??? , request_token_secret ???)
    resp = tw_session.get("account/verify_credentials.json", params={'format':'json'})    
    me = resp.json()
    user = User.get_or_create(...)

    if user:  
        login_user(user)            
    return redirect(url_for('index'))

如果有人能解释一下这一点,我们将不胜感激。

以下是一个基于Facebook的使用Flask的Twitter登录示例:

'''
    twitter
    -------

    A simple Flask demo app that shows how to login with Twitter via rauth.

    Please note: you must do `from twitter import db; db.create_all()` from
    the interpreter before running this example!
'''

from flask import (Flask, flash, request, redirect, render_template, session,
                url_for)
from flask.ext.sqlalchemy import SQLAlchemy

from rauth.service import OAuth1Service
from rauth.utils import parse_utf8_qsl


# Flask config
SQLALCHEMY_DATABASE_URI = 'sqlite:///twitter.db'
SECRET_KEY = '\xfb\x12\xdf\xa1@i\xd6>V\xc0\xbb\x8fp\x16#Z\x0b\x81\xeb\x16'
DEBUG = True
TW_KEY = 'oZSbVzKCeyAZTDxw1RKog'
TW_SECRET = 'TuNoqA6NzEBS3Zrb8test7bxQfKTlBfLTXsZ8RaKAo'

# Flask setup
app = Flask(__name__)
app.config.from_object(__name__)
db = SQLAlchemy(app)

# rauth OAuth 1.0 service wrapper
twitter = OAuth1Service(
    name='twitter',
    consumer_key=TW_KEY,
    consumer_secret=TW_SECRET,
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authorize',
    base_url='https://api.twitter.com/1.1/')


# models
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    fb_id = db.Column(db.String(120))

    def __init__(self, username, fb_id):
        self.username = username
        self.fb_id = fb_id

    def __repr__(self):
        return '<User %r>' % self.username

    @staticmethod
    def get_or_create(username, fb_id):
        user = User.query.filter_by(username=username).first()
        if user is None:
            user = User(username, fb_id)
            db.session.add(user)
            db.session.commit()
        return user


# views
@app.route('/')
def index():
    return render_template('login.html')


@app.route('/twitter/login')
def login():
    oauth_callback = url_for('authorized', _external=True)
    params = {'oauth_callback': oauth_callback}

    r = twitter.get_raw_request_token(params=params)
    data = parse_utf8_qsl(r.content)

    session['twitter_oauth'] = (data['oauth_token'],
                                data['oauth_token_secret'])
    return redirect(twitter.get_authorize_url(data['oauth_token'], **params))


@app.route('/twitter/authorized')
def authorized():
    request_token, request_token_secret = session.pop('twitter_oauth')

    # check to make sure the user authorized the request
    if not 'oauth_token' in request.args:
        flash('You did not authorize the request')
        return redirect(url_for('index'))

    try:
        creds = {'request_token': request_token,
                'request_token_secret': request_token_secret}
        params = {'oauth_verifier': request.args['oauth_verifier']}
        sess = twitter.get_auth_session(params=params, **creds)
    except Exception, e:
        flash('There was a problem logging into Twitter: ' + str(e))
        return redirect(url_for('index'))

    verify = sess.get('account/verify_credentials.json',
                    params={'format':'json'}).json()

    User.get_or_create(verify['screen_name'], verify['id'])

    flash('Logged in as ' + verify['name'])
    return redirect(url_for('index'))


if __name__ == '__main__':
    db.create_all()
    app.run()
“”
啁啾
-------
一个简单的Flask演示应用程序,演示如何通过rauth登录Twitter。
请注意:您必须从twitter导入数据库执行`操作;db.create_all()`from
运行此示例之前,请先执行解释器!
'''
从烧瓶导入(烧瓶、闪存、请求、重定向、渲染模板、会话、,
url(适用于)
从flask.ext.sqlalchemy导入sqlalchemy
从rauth.service导入OAuth1Service
从rauth.utils导入解析\u utf8\u qsl
#烧瓶配置
SQLALCHEMY\u数据库\u URI='0sqlite:///twitter.db'
密钥='\xfb\x12\xdf\xa1@i\xd6>V\xc0\xbb\x8fp\x16#Z\x0b\x81\xeb\x16'
调试=真
TW_键='oZSbVzKCeyAZTDxw1RKog'
TW_SECRET='TuNoqA6NzEBS3Zrb8test7bxQfKTlBfLTXsZ8RaKAo'
#烧瓶装置
app=烧瓶(名称)
app.config.from\u对象(\u名称\u)
db=SQLAlchemy(应用程序)
#rauth OAuth 1.0服务包装器
twitter=OAuth1Service(
name='twitter',
消费者密钥=TW密钥,
消费者秘密=TW秘密,
请求\u令牌\u url=https://api.twitter.com/oauth/request_token',
访问\u令牌\u url=https://api.twitter.com/oauth/access_token',
授权https://api.twitter.com/oauth/authorize',
基本url=https://api.twitter.com/1.1/')
#模型
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(80),unique=True)
fb_id=db.Column(db.String(120))
定义初始化(自我、用户名、fb\U id):
self.username=用户名
self.fb_id=fb_id
定义报告(自我):
返回“%self.username”
@静力学方法
def get_或_create(用户名、fb_id):
user=user.query.filter\u by(username=username).first()
如果用户为无:
用户=用户(用户名,fb\U id)
db.session.add(用户)
db.session.commit()
返回用户
#观点
@应用程序路径(“/”)
def index():
返回呈现模板('login.html')
@app.route(“/twitter/login”)
def login():
oauth\u callback=url\u for('authorized',\u external=True)
params={'oauth_callback':oauth_callback}
r=twitter.get_raw_request_令牌(params=params)
数据=parse_utf8_qsl(r.content)
会话['twitter_oauth']=(数据['oauth_令牌'],
数据['oauth\u令牌\u秘密'])
返回重定向(twitter.get_authorize_url(数据['oauth_token'],**参数))
@app.route(“/twitter/authorized”)
def authorized():
request\u token,request\u token\u secret=session.pop('twitter\u oauth'))
#检查以确保用户已授权该请求
如果request.args中没有“oauth_令牌”:
flash('您没有授权请求')
返回重定向(url_for('index'))
尝试:
creds={'request\u-token':request\u-token,
'request\u-token\u-secret':request\u-token\u-secret}
params={'oauth_验证程序]:request.args['oauth_验证程序']}
sess=twitter.get_auth_会话(params=params,**creds)
除例外情况外,e:
flash('登录Twitter时出现问题:'+str(e))
返回重定向(url_for('index'))
verify=sess.get('account/verify\u credentials.json',
params={'format':'json'}).json()
获取或创建(验证['screen\u name',验证['id'])
闪存('以'+验证['name']的身份登录)
返回重定向(url_for('index'))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
db.create_all()
app.run()

希望有帮助

简直太棒了。这两个问题都得到了解决。问题一的关键是将
oauth\u回调传递给get\u raw\u request\u token()。我相信get\u request\u token()不提供此功能。第二个问题只是将令牌保存在会话中以供重用。总的来说,如果没有一个运行的例子,它是很棘手的+1非常感谢。@maxcountryman您知道我为什么会收到twitter的错误消息吗:“哇!这个页面的请求令牌无效。它可能已经被使用,或者因为太旧而过期。请返回发送给您的站点或应用程序,再试一次;这可能只是一个错误。”我已经对twitter变量中的所有参数进行了三次检查,但这并不能解决我的问题。此外,我已在我的帐户设置中启用“使用Twitter登录”。@user1876508如果您给我发电子邮件,我很乐意查看您的代码。