首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clients = self.AVAILABLE_CLIENTS[name] KeyError:'requests‘flask authlib客户端

clients = self.AVAILABLE_CLIENTS[name] KeyError:'requests‘flask authlib客户端
EN

Stack Overflow用户
提问于 2019-11-13 01:05:33
回答 1查看 270关注 0票数 1

大家好,

对flask和authlib有一些问题。我的flash代码的一小段

代码语言:javascript
复制
from flask import Flask, render_template
from authlib.integrations.flask_client import OAuth
import os

app = Flask(__name__)
app._static_folder = os.path.abspath("static")
app.config.from_object('config')

oauth = OAuth(app)
webex = oauth.register(name='WEBEX', redirect_uri='http://webapp.dcloud.cisco.com:5000/AuthWebex', client_kwargs={
        'scope': 'spark:all'
    } )

config.py
import os

WEBEX_CLIENT_ID='C3a256be511cdf07e19f272960c44a214aec14b727b108e4f10bd124d31d2112c'
WEBEX_CLIENT_SECRET='secret'
WEBEX_ACCESS_TOKEN_URL='https://api.ciscospark.com/v1/access_token'
WEBEX_REDIRECT_URI='http://localhost:5000/AuthWebex'
WEBEX_SCOPE='spark:all'

当运行上面的代码时,我得到以下错误:

代码语言:javascript
复制
  File "/Users/tneumann/PycharmProjects/untitled/venv/lib/python3.7/site-packages/authlib/integrations/flask_client/oauth_registry.py", line 61, in register
    self.use_oauth_clients()
  File "/Users/tneumann/PycharmProjects/untitled/venv/lib/python3.7/site-packages/authlib/integrations/_client/oauth_registry.py", line 49, in use_oauth_clients
    clients = self.AVAILABLE_CLIENTS[name]
KeyError: 'requests'

看了一些例子,做了一些研究,没有运气。找不到任何解决方案...

在adv中谢谢。

托比

更新:以下是最新代码下面的评论:

代码语言:javascript
复制
from flask import Flask, render_template, url_for, request
from authlib.integrations.flask_client import OAuth
import os
import requests

app = Flask(__name__)
app._static_folder = os.path.abspath("static")
app.config.from_object('config')
app.secret_key = os.urandom(24)

oauth = OAuth(app)
oauth.register(
        'webex',
            api_base_url='https://api.ciscospark.com/v1',
            authorize_url='https://api.ciscospark.com/v1/authorize',
            access_token_url='https://api.ciscospark.com/v1/access_token',
            redirect_uri='http://webapp.dcloud.cisco.com:5000/AuthWebex',
            scope='spark:all')

@app.route('/')
def main():
    """Entry point; the view for the main page"""
    return render_template('main.html')

@app.route('/authorize')
def authorize():
    return render_template('authorize.html')

@app.route('/login')
def login():
    #redirect_uri = url_for('AuthWebex', _external=True)
    redirect_uri = 'http://webapp.dcloud.cisco.com:5000/AuthWebex'
    print(redirect_uri)
    return oauth.webex.authorize_redirect(redirect_uri)

@app.route('/AuthWebex')
def AuthWebex():
    #print(request.__dict__)
    token = oauth.webex.authorize_access_token( authorization_response=request.url,
                                                redirect_uri='http://webapp.dcloud.cisco.com:5000/AuthWebex',
                                                client_id='C3a256be511cdf07e19f272960c44a214aec14b727b108e4f10bd124d31d2112c',
                                                client_secret='secret',
                                                )
    print("Token: ", token)
    resp = oauth.webex.get('https://api.ciscospark.com/v1/people/me')
    profile = resp.json()
    print(profile)
    # do something with the token and profile
    return '<html><body><h1>Authenticated</h1></body></html>'

if __name__ == '__main__':
    app.run()

oauth.webex.authorize_access_token函数在不带参数的情况下调用时抛出和错误。这很奇怪,因为我发现的大多数例子都是这样做的。client_id和client_secret是通过config.py文件设置的。这适用于oauth.register函数,但不适用于authorize_access_token。

另外一个问题是,即使有了参数,它也会生成一个有效的令牌。当我调用get函数时,我得到以下错误:

代码语言:javascript
复制
File "/Users/tneumann/PycharmProjects/untitled/venv/lib/python3.7/site-packages/requests/models.py", line 317, in prepare
    self.prepare_auth(auth, url)
  File "/Users/tneumann/PycharmProjects/untitled/venv/lib/python3.7/site-packages/requests/models.py", line 548, in prepare_auth
    r = auth(self)
  File "/Users/tneumann/PycharmProjects/untitled/venv/lib/python3.7/site-packages/authlib/integrations/requests_client/oauth2_session.py", line 41, in __call__
    raise UnsupportedTokenTypeError(description=description)
authlib.integrations._client.errors.UnsupportedTokenTypeError: unsupported_token_type: Unsupported token_type: 'token_type'

以下是从authorize_access_token函数返回的令牌的格式

代码语言:javascript
复制
Token:  {'access_token': 'YWIzNGU3<secret>tNDQ5_PF84_7cc07dbd-<secret>-5877334424fd', 'expires_in': 1209599, 'refresh_token': 'MjU2ZDM4N2Et<secret>ZmItMTg5_PF84_7cc07dbd-<secret>877334424fd', 'refresh_token_expires_in': 7722014, 'expires_at': 1574863645}

浏览了文档,github上的代码,并在pycharm中调试,没有运气,如果有帮助,将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2019-11-20 21:51:10

这里的问题是这个AuthWebex不是一个标准的OAuth服务。响应没有token_type。我们可以使用Authlib合规性修复来修复它:

请查看此处的示例:

https://docs.authlib.org/en/latest/client/frameworks.html#compliance-fix-for-oauth-2-0

slack示例也有同样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58823429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档