Product-apim: 在反向代理问题背后设置 WSO2 API Manager

创建于 2019-11-12  ·  39评论  ·  资料来源: wso2/product-apim

在我设置的配置文件中,deployment.toml 文件中的hostnametransport.https.properties
我已经完全按照以下文档配置了 Nginx:
这里
但它不起作用。 问题是,当我尝试打开发布者门户时,它要求登录,登录后,使用正确的用户名和密码,它无法反省此 URL收到 HTTP-500 错误,因此它重定向到登录页面,因为我有登录后,它将我重定向到API 页面,并且由于它无法自省,它将我重定向到登录页面,并且这个循环永远持续下去!

我想知道我缺少什么以及如何配置它来解决这个问题?

Affecte3.0.0 TypQuestion

所有39条评论

这是一个类似的问题

嗨@amir-dh,
您能否尝试在以下位置启用反向代理
wso2am3.0.0/repository/deployment/server/jaggeryapps/publisher/site/public/theme/ defaultTheme.js

const REVERSE_PROXY = {
启用:真,
来源:'api.am.wso2.com',
};

@isharac
我确实设置了反向代理

const REVERSE_PROXY = {
启用:真,
产地: 'MYDOMAIN',
};

但再次不起作用。 当我打开发布者门户时,它给出了错误invalid_callback

@amir-dh,
您需要相应地更新回调 URL。

这是独立部署吗?
我们已经在 NGINX ingress 中发现了问题,但是如果它是一个独立的部署,它应该通过更改回调 url 来实现。
请参考我的博客 [1] 并根据您的主机名更改 admin_publisher 和 admin_store SP 应用程序的回调 URL。

很抱歉给您带来不便,但我们的文档还在 WIP 中。 我们将尽快更新文档。

[1] https://ihara-cooray.blogspot.com/2019/11/how-to-change-devportal-to-different.html

@isharac
我更新了回调 URL 但不起作用
之后我在本地主机中运行 Nginx 和 ApiM 3.0,只有我启用了反向代理和更新回调 URL。 设置域的发布者门户已运行
但是当部署示例 API 并单击“在 devportal 中查看”或“登录”时,页面 URL 为localhost:9443

@amir-dh
需要在 deployment.toml 中配置 devportal url
为此,请启用以下配置/repository/conf/deployment.toml 并将正确的 devportal url 设置为 url。

您可以通过删除 # 来启用。

[apim.devportal]

url = " https://localhost :${mgt.transport.https.port}/devportal"

@isharac
我设置了配置的这一行:

[apim.devportal]
url = " https://MyDomain/devportal "

并设置反向代理:

const REVERSE_PROXY = {
启用:真,
来源:'MyDomain',
};

但登录和注销页面 URL 是localhost 。 在出版商和开发门户上

@amir-dh
请附上上述页面的截图,包括网址。
还有 devportal SP(admin_admin_store) 的回调 url?

@isharac

  1. 我转到 devportal 页面并单击登录:

click-the-sign-in

  1. 这个 URL 是登录页面(发布者和开发者门户):

localhost-devportal

我在登录页面 MyDomain 中替换为“ localhost:9443 ”并打开了

但是当我更新回调 URL admin_admin_store并转到登录页面时,它会给出错误 invalid_callback

我和amir-dh有同样的问题

有没有办法手动编辑 api-manager.xml 来设置正确的 URL,避免服务器启动后被覆盖?

问候,

J.P

@amir-dh
谢谢,截图。
看起来您也在使用端口偏移量 2。
你能分享一下吗

/repository/deployment/jaggeryapps/devportal/site/public/theme/settings.js
和反向代理配置?

同时,我尝试通过更改主机名并在 Nginx 前面。
我遵循的步骤记录在博客 [1] 中。
如果这对您不起作用,请告诉我们。

@JUANPARBELAEZ
您能否检查同一博客 [1] 中的步骤并让我知道任何反馈?

[1] https://ihara-cooray.blogspot.com/2019/11/how-to-change-default-hostname-of-wso2.html

@isharac
你好,
我运行原始 APIM 并从这里一步一步设置配置,但它不起作用。
登录页面上的发布者和存储错误是500(此页面不起作用),输入用户名和密码并单击登录按钮后碳错误是403(禁止)。
我读了 wso2carbon.log,发布者和存储错误是连接被拒绝,对于 carbon 来说没有错误

@amir-dh
请共享以下文件以在删除任何敏感数据后进行分析。

  1. wso2carbon.log
    2.wso2am3.0.0/repository/deployment/server/jaggeryapps/publisher/site/public/theme/defaultTheme.js
  2. wso2am3.0.0/repository/deployment/server/jaggeryapps/devportal/site/public/theme/settings.js
  3. 配置文件
  4. wso2am3.0.0/repository/deployment.toml

@isharac

wso2.zip
这个给你。

@amir-dh ,
很抱歉这么晚才回你。
提供的配置看起来不错。

但是,由于最新版本中 [1] 中发现的问题,我们修改了反向代理配置。
能否请您在最新版本WSO2AM-3.1.0-M2 中重试。

[1] https://github.com/wso2/product-apim/issues/6817

从 APIM-3.1.0-M 2 开始,要配置反向代理,您需要进行以下配置更改。

  1. 更改 deployment.toml 中的主机名
    [服务器]主机名 = "api.am.wso2.com"

  2. 反向代理配置
    服务器 {
    听 443 ssl;
    server_name api.am.wso2.com;
    proxy_set_header X-Forwarded-Port 443;
    ssl_certificate /usr/local/etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /usr/local/etc/nginx/ssl/nginx.key;
    地点 / {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass https://api.am.wso2.com :9443;
    }
    }

  3. 在 /etc/hosts 添加主机映射
    127.0.0.1 。

  4. 如果您不是第一次启动服务器,请通过登录管理控制台来更改回调 URL。
    https://api.am.wso2.com :9443/carbon/

转到服务提供商并找到 admin_admin_publisher
发布者中的回调 URL
regexp=(https://api.am.wso2.com:9443/publisher/services/auth/callback/login|https://api.am.wso2.com:9443/publisher/services/auth/callback/logout )

@isharac
我下载了 APIM-3.1.0-M2,更改了 deployment.toml 文件中的hostname并将 nginx 配置更改为:
服务器 {
听 443 ssl;
server_name myDomain ;
proxy_set_header X-Forwarded-Port 443;
ssl_certificate /usr/local/etc/nginx/ssl/nginx.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/nginx.key;
地点 / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https:// myDomain :9443;
}
}

但它不起作用。
当调用publisher它重定向到这里。 如您所见,它通过端口将我重定向到 MyDomain。 不是反向代理 URI,例如,它将我从https://mydomain.com/publisher重定向到https://mydomain.com:9445/oauth2/..... 。 如果我手动删除后跟 mydomain 的端口,它将正常工作。
当我想登录时,这个问题对于devportal也是一样的。

对于Management Console登录后,它从登录页面重定向到此 url并给出错误 403(forbidden)

仅供参考:我检查了您发送给我的问题; 在features/apimgt/org.wso2.carbon.apimgt.publisher.feature/src/main/resources/publisher/site/public/theme/defaultTheme.js

reverseProxy: {
            auto: true,
            forwardedHeader: 'x-forwarded-for',
            loopbackHost: 'localhost',
            defaultHTTPSPort: 9443,
        },

在问题 [1] 中可用,但在 [2] 中不可用

[1] (https://github.com/wso2/carbon-apimgt/pull/7842/files/88efcf71b4aa4b8bf5511db8fc91655ba7969aa8?utf8=%E2%9C%93&diff=split&w=1)

[2] (https://github.com/wso2/carbon-apimgt/pull/7858/files)

嗨@amir-dh

抱歉,您还需要在 deployment.toml 中添加代理端口

请在下面添加配置/repository/conf/deployment.toml
[transport.https.properties]
代理端口 = 443

@isharac
我在部署文件中添加了代理端口

我打电话给https://mydomain.com/它重定向到发布者门户
但是当我调用https://mydomain.com/publisher它会重定向到https://**myIP**/publisher并且我收到此消息This site can’t be reached 。 在devportalcarbon网址中,我遇到了同样的错误

@amir-dh
请找到我的评论。

''我调用https://mydomain.com/它重定向到发布者门户''
这是默认情况。

重定向到 IP 看起来有点奇怪。
能否分享一下从浏览器控制台下载的 nginx.conf 和 HAR 文件以供进一步分析?

Yiou可以参考下面找到chrome中的下载按钮。
Screen Shot 2019-11-28 at 11 04 14 AM

配置文件
这个给你

@amir-dh
感谢分享配置。

在您的 nginx.conf proxyPass 中配置了 IP。
您能否将其更改为以下域并重新检查?

proxy_pass https://myDomain :9443;

谢谢。

嗨@amir-dh ,

我在给定的 HAR 中看不到任何重定向到 IP 地址。 请求失败的原因似乎是

invalid_callback
--
Registered callback does not match with the provided url.

所以问题很可能是, admin_apim_publisher给出的回调 URL

image

它应该在正则表达式中有以下 URL

https://mydomain.com/publisher/services/auth/callback/login

@isharac @tmkasun
感谢你们对我的帮助。
用你的提示解决了我的问题。
我设置以下配置:

  1. 部署文件中hostname更改mydomain
  2. 设置 Nginx 配置:
server {
listen 443 ssl;
server_name myDomain;
proxy_set_header X-Forwarded-Port 443;
ssl_certificate /usr/local/etc/nginx/ssl/nginx.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/nginx.key;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://myDomain:9443;
}
}
  1. 在部署文件中添加代理端口:
    [transport.https.properties]
    代理端口 = 443

  2. 将部署文件中的devportal URL 和gwdevportal URL 从localhost更改为mydomain.com并删除端口

  3. 在控制台管理中更改回调 url 并删除端口。

@amir-dh
很高兴您能够解决问题。 :)

@isharac
我确实按照所有配置
我看到了“ TypeError:无法从未定义中读取属性“forwardedHeader”......”
当我尝试在 $HOST/devportal/apis 中叹气时
该页面将被重定向到 $HOST/devportal/services/configs

你有什么建议吗 ?
请给我一个答复

环境

nginx 版本:nginx/1.10.3
WSO2 APIM 3.1.0 M3

TID:[-1234] [devportal] [2019-12-03 02:19:55,194] 错误 {org.jaggeryjs.jaggery.core.manager.WebAppManager} - org.mozilla.javascript.EcmaError:TypeError:无法读取属性“ forwardedHeader" 来自未定义 (/devportal/services/login/idp.jag#28) org.jaggeryjs.scriptengine.exceptions.ScriptException: org.mozilla.javascript.EcmaError: TypeError: 无法从未定义 (/devportal/服务/登录/idp.jag#28)
在 org.jaggeryjs.scriptengine.engine.RhinoEngine.execScript(RhinoEngine.java:587)
在 org.jaggeryjs.scriptengine.engine.RhinoEngine.exec(RhinoEngine.java:289)
在 org.jaggeryjs.jaggery.core.manager.WebAppManager.exec(WebAppManager.java:589)
在 org.jaggeryjs.jaggery.core.manager.WebAppManager.execute(WebAppManager.java:508)
在 org.jaggeryjs.jaggery.core.JaggeryServlet.doGet(JaggeryServlet.java:24)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
在 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352)
在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
在 org.jaggeryjs.jaggery.core.JaggeryFilter.doFilter(JaggeryFilter.java:76)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.wso2.carbon.ui.filters.cache.ContentTypeBasedCachePreventionFilter.doFilter(ContentTypeBasedCachePreventionFilter.java:53)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:126)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
在 org.wso2.carbon.identity.context.rewrite.valve.TenantContextRewriteValve.invoke(TenantContextRewriteValve.java:80)
在 org.wso2.carbon.identity.authz.valve.AuthorizationValve.invoke(AuthorizationValve.java:100)
在 org.wso2.carbon.identity.auth.valve.AuthenticationValve.invoke(AuthenticationValve.java:74)
在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:99)
在 org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:49)
在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:62)
在 org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:146)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
在 org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:57)
在 org.wso2.carbon.tomcat.ext.valves.RequestCorrelationIdValve.invoke(RequestCorrelationIdValve.java:116)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:748)
引起:org.mozilla.javascript.EcmaError:TypeError:无法从未定义中读取属性“forwardedHeader”(/devportal/services/login/idp.jag#28)
在 org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
在 org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
在 org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3693)
在 org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3712)
在 org.mozilla.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3725)
在 org.mozilla.javascript.ScriptRuntime.getObjectProp(ScriptRuntime.java:1483)
在 org.jaggeryjs.rhino.devportal.services.login.c0._c_script_0(/devportal/services/login/idp.jag:28)
在 org.jaggeryjs.rhino.devportal.services.login.c0.call(/devportal/services/login/idp.jag)
在 org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
在 org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
在 org.jaggeryjs.rhino.devportal.services.login.c0.call(/devportal/services/login/idp.jag)
在 org.jaggeryjs.rhino.devportal.services.login.c0.exec(/devportal/services/login/idp.jag)
在 org.jaggeryjs.scriptengine.engine.RhinoEngine.execScript(RhinoEngine.java:583)
……还有 50 个

嗨@loeb-ift

您使用的 APIM 版本是什么?
你能分享 devportal/site/public/theme/settings.js

嗨@isharac
如下
root@wso2am-313 :/tmp/20191203# vi /opt/wso2am-3.1.0-m3/repository/deployment/server/jaggeryapps/devportal/site/public/theme/settings.js

常量设置 = {
应用程序: {
上下文:'/ devportal',
反向代理:{
启用:真,
来源:' https://MYHOST ',
},
},
授予类型:{
授权代码:'代码',
隐式:'隐式',
refresh_token: '刷新令牌',
密码:'密码',
' iwa:ntlm ': 'IWA-NTLM',
client_credentials: '客户端凭据',
' urn:ietf : params:oauth :grant-type:saml2-bearer ': 'SAML2',
' urn:ietf : params:oauth :grant -type:jwt-bearer ': 'JWT',
kerberos: 'Kerberos',
},
};

太感谢了

@loeb-ift
你对这个文件做了什么改动吗?

应用程序 json 应如下所示。

app: {
    context: '/devportal',
    customUrl: {
        enabled: false,
        forwardedHeader: 'X-Forwarded-For',
    },
    origin: {
        host: 'localhost',
    },
},

默认配置文件请参考[1]。
[1] https://github.com/wso2/carbon-apimgt/blob/v6.5.399/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/devportal/site/public /主题/settings.js

参考 [https://ishara-cooray.blogspot.com/2019/11/how-to-change-default-hostname-of-wso2.html] 中的文档

我试图添加反向代理设置并编辑配置 /devportal/site/public/theme/settings.js
我看到我丢失了 ' forwardedHeader: 'X-Forwarded-For','
但它没有看到任何作品!

现在 setting.js 是:

`const 设置 = {
应用程序: {
上下文:'/ devportal',
反向代理:{
启用:真,
来源:'https://$MYHOST',
forwardedHeader: 'X-Forwarded-For',
},
},
};

grantTypes: {
    authorization_code: 'Code',
    implicit: 'Implicit',
    refresh_token: 'Refresh Token',
    password: 'Password',
    'iwa:ntlm': 'IWA-NTLM',
    client_credentials: 'Client Credentials',
    'urn:ietf:params:oauth:grant-type:saml2-bearer': 'SAML2',
    'urn:ietf:params:oauth:grant-type:jwt-bearer': 'JWT',
    kerberos: 'Kerberos',
 },

};

如果博客具有误导性,请道歉,但正如我在博客中记录的那样,它仅适用于 APIM 3.0.0
因为我们必须在 APIM 3.1.0-m2 之后更改反向代理配置。
我会用最新的配置更新博客。

请按照注释[1]中的步骤在APIM 3.1.0-m3中配置反向代理

[1] https://github.com/wso2/product-apim/issues/6808#issuecomment -559584220

@isharac
感谢您的留言
实际上,该博客提供了很多帮助
但我错过了重要的一点
安装总结

操作系统:Debian 4.9.189-3+deb9u2 (2019-11-11) x86_64 GNU/Linux
nginx 版本:nginx/1.10.3 与 WSO2 3.1.0 M3
安装步骤。
[ https://github.com/wso2/product-apim/issues/6808#issuecomment -559584220]

它现在有效

你好,
我对 nginx 前端(WSO2 APIM 3.0)有同样的问题
当我尝试打开发布者或开发门户时,我的控制台中出现以下错误
-错误:错误:未找到部分令牌,重定向到匿名视图且未找到用户。 令牌刷新失败。
/admin 和 /carbon 运行良好

nginx 版本:前端服务器中的 nginx/1.16.1
WSO2 - APIM 不是其他服务器(CentOS Linux 版本 7.7.1908)
通过 rpm 安装 WSO2 APIM 3.0(WSO2 站点中的鳍)

网络流量 9443,443 和 8243 是开放的和 Nginx Fronted 和 WSO2 APIM 3.0 Server

你能帮我吗,我没有任何解决办法:(

谢谢

山姆

@SamWso2

我认为您指的是这些日志消息,

image

这些是打印出来的一些信息日志以识别登录状态,您也会在正常设置中看到这些日志

你能解释一下你的问题吗? 或提供 HTTP 存档 (HAR) 文件来分析问题?

如果您遇到持续登录循环场景,您可以按照@isharac的博客在 APIM 3.0.0 中配置反向代理

https://ihara-cooray.blogspot.com/2019/11/how-to-change-devportal-to-different.html

嗨 tmkasun,

在内部我可以登录 /devportan 和 /publisher
在外部,我使用公共 URL(在 NGINX 中配置),我可以在 Carbon 和管理门户中访问
我也可以在 devportal URL 中访问,但我无法登录,它的循环......我什么也没得到
我的生产环境中有 WSO2 APIM 2.6 和 NGINcXin,它运行良好。

谢谢

我使用 Squid 代理(和前面的 Nginx 反向代理)上网,但我没有在 WSO2 配置中实现这个参数。
我应该如何配置代理以在 wSO2 APIM 3.0 上上网?

谢谢

我已经把

但我有以下错误

TID:[-1234] [devportal] [2020-03-10 10:45:20,910] 错误 {org.jaggeryjs.jaggery.core.manager.WebAppManager} - org.mozilla.javascript.WrappedException:包装的 org.jaggeryjs.scriptengine .exceptions.ScriptException:java.net.ConnectException:连接被拒绝(连接被拒绝)(<>/META-INF/scripts/http.js#220) org.jaggeryjs.scriptengine.exceptions.ScriptException: org.mozilla.javascript.WrappedException: Wrapped org.jaggeryjs.scriptengine.exceptions.ScriptException: java.net.ConnectException: Connection拒绝(连接被拒绝)(<>/META-INF/scripts/http.js#220)

我在前端使用 nginx 服务器作为反向代理 = OK
但是我使用鱿鱼代理上网

我应该如何配置代理鱿鱼以在 wSO2 APIM 3.0 配置上上网? (没有 NGINX 反向代理,而是 squi 代理)

谢谢

嗨@isharac
我正在使用 wso2am 3.1.0 我想使用 nginx 路由 wso2。 我已经用主机名和 pory 端口配置了 wso2 deployment.toml 并配置了 nginx 但我仍然面临这个问题。你能帮我吗

Nginx 托管在一个 VM 中,而 wso2 可在其他 VM 中使用

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

okhuz picture okhuz  ·  8评论

malinthaprasan picture malinthaprasan  ·  6评论

ruks picture ruks  ·  11评论

YannickB picture YannickB  ·  25评论

isharac picture isharac  ·  11评论