我正在尝试获得使用Retrofit / rxjava的经验,因此我决定创建一个模仿Vimeo应用程序的应用程序。我一直坚持实施vimeo api的ouath身份验证(我也知道Vimeo具有Android SDK。由于我想亲自体验REST服务,所以我不想使用它。)
基本上,我正在尝试通过WebView进行此操作。我相信我的逻辑是正确的,而且我知道授权URL没有错,因为它可以在笔记本电脑的Web浏览器中使用。但是,在该应用程序中,我收到一个错误,即用户在Vimeo的网站上输入登录信息后,出现一个页面,显示“未经授权-此操作无法完成,因为您的表单会话已过期。请确保cookie是已启用。”
这是我编写的用于处理webview逻辑的代码段:
@SuppressLint("SetJavaScriptEnabled")
public void onSignInMessageButtonClick() {
showSignInWebView(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.getSettings().setSupportMultipleWindows(true);
mWebView.getSettings().setUserAgentString("vimeo_test_app");
if (android.os.Build.VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
CookieManager.getInstance().setAcceptCookie(true);
} else {
CookieManager.getInstance().setAcceptCookie(true);
}
mWebView.loadUrl("https://api.vimeo.com/oauth/authorize?client_id=" + VimeoClientCredentials.API_OAUTH_CLIENTID +
"&response_type=code&redirect_uri=" + VimeoClientCredentials.API_OAUTH_REDIRECT +
"&state=" + UUID.randomUUID().toString());
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading (WebView webView, String url) {
Log.i(TAG, "shouldOverrideUrlLoading called: " + url);
Uri uri = Uri.parse(url);
if (uri.toString().startsWith(VimeoClientCredentials.API_OAUTH_REDIRECT)) {
webView.stopLoading();
webView.loadUrl("about:blank");
String code = Uri.parse(url).getQueryParameter("code");
if (code != null) {
mUserPresenter.getOauthToken(code, VimeoClientCredentials.API_OAUTH_REDIRECT);
}
else {
showUnauthorizedError();
}
return true;
}
return false;
}
});
}
还有其他人遇到过这个问题吗?
更新: 看来这是WebView中设置cookie的问题。我在笔记本电脑的网络浏览器上关闭了Cookie,并尝试了oauth进程,并得到了相同的错误。通过阅读StackOverflow上的解决方案,似乎我正在正确地在WebView上启用cookie,因此不确定出了什么问题。
答案 0 :(得分:0)
经过大量的试验和错误,看来我对用户代理的重载导致了此问题。这是问题所在的行:
mWebView.getSettings().setUserAgentString("vimeo_test_app");
我以前添加了该行代码来解决以下事实:Google登录无法通过WebView运行。这是删除了所有不必要行的最终代码:
@SuppressLint("SetJavaScriptEnabled")
public void onSignInMessageButtonClick() {
showSignInWebView(true);
String authUrl = "https://api.vimeo.com/oauth/authorize?client_id=" + VimeoClientCredentials.API_OAUTH_CLIENTID +
"&response_type=code&redirect_uri=" + VimeoClientCredentials.API_OAUTH_REDIRECT +
"&state=" + UUID.randomUUID().toString();
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(authUrl);
if (android.os.Build.VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
} else {
CookieManager.getInstance().setAcceptCookie(true);
}
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading (WebView webView, String url) {
if (url.startsWith(VimeoClientCredentials.API_OAUTH_REDIRECT)) {
webView.stopLoading();
webView.loadUrl("about:blank");
showSignInWebView(false);
String code = Uri.parse(url).getQueryParameter("code");
if (code != null) {
mUserPresenter.getOauthToken(code, VimeoClientCredentials.API_OAUTH_REDIRECT);
}
else {
showUnauthorizedError();
}
return true;
}
return false;
}
});
}