【发布时间】:2019-04-20 01:52:53
【问题描述】:
我正在开发休息服务并通过 ajax 使用这些服务。
现在我已经使用 okta 保护了我的 Web 服务,当我从 chrome 或任何浏览器调用时它运行良好。但是如果我试图从 Jquery/ajax 中消费,我会遇到错误。任何人都可以请帮忙。
我曾使用 python、flask 开发 web 服务并使用 OpenIdConnect(flask_oidc) 进行身份验证。 一段代码
app = Flask(__name__)
app.config["OIDC_CLIENT_SECRETS"] =
services_dir+"okta/client_secrets.json"
app.config["OIDC_COOKIE_SECURE"] = False
app.config["OIDC_CALLBACK_ROUTE"] = "/oidc/callback"
app.config["OIDC_SCOPES"] = ["openid", "profile"]
app.config["SECRET_KEY"] = "********"
app.config['CORS_HEADERS'] = 'Content-Type'
oidc = OpenIDConnect(app)
cors = CORS(app, resources={r"/ai/*": {"origins": "*"}})
@app.before_request
def before_request():
print("Before request",oidc.user_loggedin)
if oidc.user_loggedin:
#print("access token",oidc.get_access_token())
print("sub",oidc.user_getinfo(["name"]))
g.user = oidc.user_getfield("name")
else:
g.user = None
@app.route('/ai/docsearchStatus', methods = ['GET'])
@cross_origin(origin='*')
@oidc.require_login
def getHealthstatus():
response = {}
response['user'] = g.user
response=json.dumps(response);
return response
Jquery Ajax 代码:
$.ajax({
type:"GET",
url: "https://https://example.com/ai/docsearchStatus",
beforeSend: function(xhr) {
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
},
success:function(data, textStatus, XMLHttpRequest){
},
error:function(XMLHttpRequest, textStatus, errorThrown){
//fnHideLoader();
}
});
如果我调用 https:///ai/docsearchStatus 它工作正常(重定向--验证--得到响应)。 当我从 ajax 尝试时,我得到以下 URL: 错误是:
Failed to load https://mycompany.okta.com/oauth2/ausl2cu6foKJx4WXS0x7/v1/authorize? Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘https://example.com’ is therefore not allowed access.
任何人都可以帮助解决这个问题。我什至通过 API > Trusted Origins 在 okta admin 中配置了https://example.com。
【问题讨论】:
-
访问控制标头必须由端点服务器设置作为响应。您不能在客户端请求中设置它们。您可以使用您的服务器作为代理发出 api 请求并使用 ajax 调用您的服务器并将 api 数据返回给 ajax
-
感谢您的快速回复。我在我的服务中启用了 cors,您可以在上面的代码中看到。如果我在上述服务中删除 @oidc.require_login 它将起作用。 Okta 不允许。
-
所以如果我在 okta admin 中将 origin 添加为受信任,它将解决问题。在那种情况下,我已经添加了。
标签: jquery ajax flask okta openid-connect