python - 客户端无权使用此方法请求授权码
问题描述
我需要在 GET 请求 Authlib 上生成一个授权令牌。用户不需要确认对资源的访问,因为它是封闭的网络,只有受信任的服务(我们的服务)可以发送请求。
使用此OAuth 2.0 Provider示例
,我编写了下一个:
在路由中:
@bp.route("/oauth/authorize", methods=['GET'])
@login_required
def authorize():
user = current_user()
return server.create_authorization_response(grant_user=user)
我的oauth模块:
server = AuthorizationServer()
require_oauth = ResourceProtector()
class AuthorizationCodeGrant(grants.AuthorizationCodeGrant):
def create_authorization_code(self, client, grant_user, request):
# you can use other method to generate this code
code = generate_token(48)
item = AuthorizationCode(
code=code,
client_id=client.client_id,
redirect_uri=request.redirect_uri,
scope=request.scope,
user_id=grant_user.get_user_id(),
)
db.session.add(item)
db.session.commit()
return code
def parse_authorization_code(self, code, client):
item = AuthorizationCode.query.filter_by(code=code, client_id=client.client_id)\
.first()
if item and not item.is_expired():
return item
def delete_authorization_code(self, authorization_code):
db.session.delete(authorization_code)
db.session.commit()
def authenticate_user(self, authorization_code):
return User.query.get(authorization_code.user_id)
def current_user():
if 'id' in session:
uid = session['id']
return User.query.get(uid)
return None
def query_client(client_id):
return Client.query.filter_by(client_id=client_id).first()
def save_token(token, request):
if request.user:
user_id = request.user.get_user_id()
else:
# client_credentials grant_type
user_id = request.client.user_id
item = Token(
client_id=request.client.client_id,
user_id=user_id,
**token
)
db.session.add(item)
db.session.commit()
def init_oauth2(app):
server.init_app(app, query_client=query_client, save_token=save_token)
# register it to grant endpoint
server.register_grant(AuthorizationCodeGrant)
但是当我尝试发送请求时:
http://127.0.0.1:5000/oauth/authorize?response_type=code&client_id=my_client_id
服务器返回错误:
{
"error": "unauthorized_client",
"error_description": "The client is not authorized to request an authorization code using this method"
}
我启用了不安全的传输模式,并且该客户端已在数据库中注册。我client_id
从数据库中取出了它select client_id from clients
。它说客户端是授权的,但我想授权它,当然,它是未经授权的。怎么了?
PS 我的仓库
添加:
我需要response_type
为客户指定。
解决方案
这意味着您的客户端不支持代码响应类型。客户端上有一个 check_response_type 方法,确保它会返回 True。
推荐阅读
- r - 小标题里面的小标题到列表
- c++ - 将 jpeg 文件读取为无符号字符数组
- java - 使用 AfterInstall 和 Inno Setup 时如何运行包含空格的路径(捆绑的 JRE)的命令
- html - 使用叠加按钮构建网格图块
- php - php 中缺少类 php_com_dotnet
- ios - UICollectionView 重新加载数据而不调用 reloadData()
- javascript - 保存平面列表中的参数导航,并将其显示在另一个屏幕上
- javascript - ReactJS 中的异步函数阻塞组件
- docx4j - 通过 docx4j-export-fo 在 TOC 中获取错误的页码
- .net - 使用 CefSharp 从 JavaScript 调用 C# 是否有一种不那么痛苦的方法?