我正在实施OAuth(使用rauth)并将提供JWT令牌(使用flask-jwt),javascript前端(Angular1).我已经完成了基于经典cookie /会话的应用程序.有用.现在我想用JWT令牌来做.
如果我理解正确,用户将被重定向到提供商(例如谷歌),登录帐户,我的服务器和提供商做魔术,然后提供商将用户重定向回我的页面.现在我获得了用户个人资料,结束了OAuth部分.通过正常会话,您可以为用户设置cookie以及其他用于设置会话的内容,然后将其重定向到主页.
这就是我被困住的地方.有什么好的做法如何在提供商发回给用户后给用户JWT令牌?在重定向到主页时将其作为cookie提供给用户?把它放在标题中?据我所知,我需要javascript将令牌保存到LocalStorage/SessionStorage.
试图让 OAuth2 Google 登录工作,这是我的应用程序发出的原始请求:
方法: POST
网址: https://www.googleapis.com/oauth2/v3/token
标题: Content-Type: application/x-www-form-urlencoded
价值观:
client_id: XXX-0123456789abcdef0123456789abcdef.apps.googleusercontent.com
client_secret: A1b2C3d4E5f6G7h8I9j0K1l2M
code: 1/A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v
grant_type: authorization_code
redirect_uri: http://localhost:5000/callback/google/
这是回应:
地位: 401 Unauthorized
身体:
{
"error": "invalid_client",
"error_description": "Unauthorized"
}
Run Code Online (Sandbox Code Playgroud)
已验证这是我的应用程序正在制作的确切请求/响应(使用 Flask 和 rauth 的 Python 应用程序),并已验证我可以使用 Postman 重现完全相同的请求/响应。
根据其他线程中的说明,我在 Google API 控制台中完成了以下所有操作:
无论我做什么,仍然得到相同的响应"invalid_client": "Unauthorized"。
对此的帮助将不胜感激。我正在尝试在我的应用程序中设置 OAuth2 驱动的“使用 X 登录”功能,已经让 Facebook 和 Twitter 正常工作,也想让 …
基于rauth示例中的脚本,我有一个twitter使用rauth(OAuth1)的客户端的以下实现:twitter-timeline-cli.py
from rauth.service import OAuth1Service
class TwitterClient:
KNOWN_USERS = {
'user1' : ("xxx", "yyy", "2342354"), # These should be real tokens
}
def __init__(self):
# Get a real consumer key & secret from https://dev.twitter.com/apps/new
self.twitter = OAuth1Service(
name='twitter',
consumer_key=TWITTER_CONSUMER_KEY,
consumer_secret=TWITTER_CONSUMER_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/')
def authorize(self):
request_token, request_token_secret = self.twitter.get_request_token()
authorize_url = self.twitter.get_authorize_url(request_token)
print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')
return …Run Code Online (Sandbox Code Playgroud) 这是我连接到Box的代码,但是我无法使用box_storage.get_auth_session(data = data).来自rauth import OAuth2Service
box_storage = OAuth2Service(
name='Box',
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
authorize_url='https://www.box.com/api/oauth2/authorize',
access_token_url='https://www.box.com/api/oauth2/token',
base_url='https://www.box.com/'
)
redirect_uri = 'http://127.0.0.1'
params = {
'redirect_uri': redirect_uri,
'response_type': 'code',
'state': 'good'
}
url = box_storage.get_authorize_url(**params)
data = {'code': 'foobar',
'grant_type': 'authorization_code',
'redirect_uri': redirect_uri}
session = box_storage.get_auth_session(data=data)
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Traceback (most recent call last):
File "C:\Users\rushd\Documents\Aptana Studio 3 Workspace\practice\box.py", line 24, in <module>
session = box_storage.get_auth_session(data=data)
File "C:\Users\rushd\Envs\practice\lib\site-packages\rauth\service.py", line 533, in get_auth_session
return self.get_session(self.get_access_token(method, **kwargs))
File "C:\Users\rushd\Envs\practice\lib\site-packages\rauth\service.py", line 519, in get_access_token
access_token, = process_token_request(r, decoder, key) …Run Code Online (Sandbox Code Playgroud) 我们使用Rauth连接到各种OAuth 1 API.它适用于单个请求,但尝试针对给定会话执行2个或更多请求会导致401未经API授权的错误.
Twitter API示例:
import requests
from rauth import OAuth1Service
from rauth import OAuth1Session
consumer_key = {the consumer key}
consumer_secret = {the consumer secret}
access_token = {the access token}
access_token_secret = {the access token secret}
oauth_service = OAuth1Service(consumer_key = consumer_key,
consumer_secret = consumer_secret)
oauth_session = oauth_service.get_session(token = (access_token, access_secret))
url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
params = {'include_rts': 'true'}
r = oauth_session.get(url, params=params) # THIS WORKS
r = oauth_session.get(url, params=params) # THIS RETURNS 401 ERROR
Run Code Online (Sandbox Code Playgroud)
这种情况发生在Twitter和LinkedIn API上.我们如何针对单个OAuth1Session对象执行多个请求?
版本: …
我有一个应用程序引擎应用程序,使用oauth和rauth,我正在尝试使用Facebook,Twitter和谷歌登录.
当我在本地运行它工作,但在生产中我得到这个错误,但只有谷歌加,与Facebook工作正常.
('连接已中止.',错误(13,'权限被拒绝'))回溯(最近一次调用最后一次):文件"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/ webapp2.py",第1535行,在调用 rv = self.handle_exception(request,response,e)文件"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py ",第1529行,在调用 rv = self.router.dispatch(请求,响应)文件"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py",行1278,在default_dispatcher中返回route.handler_adapter(请求,响应)文件"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py",第1102行,在调用 返回处理程序中.dispatch()文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/handler.py",第11行,在调度webapp2.RequestHandler.dispatch(self)文件"/ base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py",第5行 72,在调度返回self.handle_exception(e,self.app.debug)文件"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py",第570行, in dispatch return方法(*args,**kwargs)文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/loginToken.py",第69行,in get ep = log.getTokenData(code )文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/conect.py",第34行,在getTokenData session = self.getSession(conf,code)文件"/ base /data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/conect.py",第61行,在getSession session = conf.get_auth_session(data = self.getData(code),decoder = json. load)文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/service.py",第556行,get_auth_session session = self.get_session(self.get_access_token(method) ,**kwargs))文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/service.py",第541行,在get_acc中 ess_token r = self.get_raw_access_token(method,**kwargs)get_raw_access_token中的文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/service.py",第518行**kwargs)文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/session.py",第358行,请求返回超级(OAuth2Session,self).request (方法,网址,**req_kwargs)文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/requests/sessions.py",第457行,请求resp = self.send(prep,**send_kwargs)文件"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/requests/sessions.py",第569行,发送r = adapter.send(request,**kwargs)file"/base/data/home/apps/s~app-getwell/login:1.379942143707124638/code/oauth/rauth/requests/adapters.py",第407行,发送引发ConnectionError(错误,请求=请求)ConnectionError :('连接已中止.',错误(13,'权限被拒绝'))
我启用了计费,并且在yaml中添加了ssl库(后期)
这是我进行oauth调用的代码
class login():
def __init__(self,tipo=tipoConexion.Google, redirect_uri = 'http://map.getwell.care/'):
self.__tipo=tipo
self.config=config.data(redirect_uri)
def getAuthorizationURL(self):
conf=self.getConfig()
params=self.getParams()
url = conf.get_authorize_url(**params)
return url
def getTokenData(self, code):
''' Get the …Run Code Online (Sandbox Code Playgroud) from rauth import OAuth1Service
OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/!api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/!api/1.0/oauth/access_token"
service = OAuth1Service(
name='test',
consumer_key='xxxxxxxxxxxxxx',
consumer_secret='xxxxxxxxxxxxxxxxxxxx',
request_token_url=OAUTH_REQUEST,
access_token_url=OAUTH_ACCESS,
authorize_url=OAUTH_AUTH)
resp = service.get_raw_request_token()
print resp
Run Code Online (Sandbox Code Playgroud)
我继续使用Bitbucket并生成一个消费者密钥对,但回复是400.任何想法是怎么回事?
我看了Bitbucket文档,网址是正确的.
编辑
感谢@maxcountryman在这里抽出时间.
我刚看了他的linklin示例代码:
import os
from rauth import OAuth1Service
OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/!api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/!api/1.0/oauth/access_token"
service = OAuth1Service(
name='test',
consumer_key='blah',
consumer_secret='blah',
request_token_url=OAUTH_REQUEST,
access_token_url=OAUTH_ACCESS,
authorize_url=OAUTH_AUTH)
# You can run python -m SimpleHTTPServer if you want a local callback
rtoken, rtoken_secret = service.get_request_token(params={'oauth_callback': 'http://localhost:8000'})
authorize_url = service.get_authorize_url(rtoken)
print …Run Code Online (Sandbox Code Playgroud) 我对Oauth的态度不是很强,所以需要一些帮助来实现我的FreeAgent会计系统的接口,它们提供了一个Oauth 2 API.
我想用标准Python编写代码,看起来最好的库是Rauth.我的问题是令人耳目一新的令牌.
有没有关于如何使用python Rauth库刷新过期令牌的好样本?什么是处理到期的最佳做法?我可以尝试使用我的令牌,如果因过期而出现错误请求刷新.或者也许我可以跟踪令牌的生命,如果我的计算表明它已经过期,那么请求另一个.哪里最好保存所有这些令牌信息:在配置文件中,在JSON对象中,到数据库......?
谢谢你的帮助.
格雷格
rauth中提供的示例是使用PIN而不是回调.我不明白这应该通过网络回调如何工作.
1)小问题:
根据twitter,如果oauth_callback传入了URL,则应该使用它来代替https://dev.twitter.com设置中的任何条目.然而,这似乎不是真的,如果我没有设置它,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))
Run Code Online (Sandbox Code Playgroud)
2)主要问题在于:
我可以看到request.args有['oauth_token']和['oauth_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'))
Run Code Online (Sandbox Code Playgroud)
如果有人能够对此有所了解,我将非常感激.
我有以下测试程序:
from rauth.service import OAuth1Service, OAuth2Service
SUPPORTED_SERVICES = {
'twitter' : ( 'OAuth1', 'twitter', 'https://api.twitter.com/oauth', 'request_token', 'access_token', 'authorize', 'https://api.twitter.com/1/', None),
'facebook' : ( 'OAuth2', 'facebook', 'https://graph.facebook.com/oauth', None, 'access_token', 'authorize', 'https://graph.facebook.com/', 'https://www.facebook.com/connect/login_success.html'),
'google' : ( 'OAuth2', 'google', 'https://accounts.google.com/o/oauth2', None, 'token', 'auth', None, 'http://localhost'),
}
CLIENT_DATA = {
'twitter' : ('dummy_client_id', 'dummy_client_secret'),
'facebook' : ('dummy_client_id', 'dummy_client_secret'),
'google' : ('dummy_client_id', 'dummy_client_secret'),
}
USER_TOKENS = {
'user1' : {
'twitter' : ('dummy_access_token', 'dummy_access_token_secret'),
'facebook' : ('dummy_access_token', None),
'google' : ('dummy_access_token', None),
}
}
def …Run Code Online (Sandbox Code Playgroud) rauth ×10
python ×8
oauth ×7
bitbucket ×1
flask ×1
google-api ×1
google-oauth ×1
google-plus ×1
jwt ×1
oauth-2.0 ×1