好的,所以,我正在为 Android 制作一个 Tumblr 客户端,我一直在尝试让 OAuth 工作大约一个星期,但一直未能成功。事情是这样的:
用户启动应用程序。主 Activity 的 onCreate 执行此操作:
settings = getSharedPreferences(PREFS_NAME, 0);
authToken=settings.getString("OauthToken", "none");
authTokenSecret=settings.getString("OauthSecret", "none");
if(authToken=="none" || authTokenSecret=="none"){
Intent i = new Intent(getApplicationContext(),Authentication.class);
startActivity(i);
}
这会启动一个包含 WebView 的身份验证 Activity 。该 Activity 成功获取请求 token ,并将 WebView 发送到 Tumblr 登录屏幕。用户被要求允许应用程序访问他们的数据,他们按下允许,我的 WebViewClient 捕获回调 Url,并使用它执行此操作:
String[] token = helper.getVerifier(url);
if (token != null) {
try {
String accessToken[] = helper.getAccessToken(token[1]);
editor.putString("OauthToken", accessToken[0]);
editor.putString("OauthSecret", accessToken[1]);
editor.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
finish();
辅助类的 getAccessToken 和 getVerifier 看起来像这样:
public String[] getVerifier(String myUrl) {
// extract the token if it exists
Uri uri = Uri.parse(myUrl);
if (uri == null) {
return null;
}
String token = uri.getQueryParameter("oauth_token");
String verifier = uri.getQueryParameter("oauth_verifier");
return new String[] { token, verifier };
}
public String[] getAccessToken(final String verifier)
throws OAuthMessageSignerException, OAuthNotAuthorizedException,
OAuthExpectationFailedException, OAuthCommunicationException {
new Thread(new Runnable() {
public void run() {
try {
mProvider.retrieveAccessToken(mConsumer, verifier);
} catch (OAuthMessageSignerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthCommunicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
return new String[] {
mConsumer.getToken(), mConsumer.getTokenSecret()
};
}
然后我终于回到主应用程序屏幕并尝试进行我的第一个 API 调用,以获取用户仪表板上的最新十篇帖子:
OAuthConsumer myConsumer = new CommonsHttpOAuthConsumer(MainView.authToken, MainView.authTokenSecret);
HttpGet request = new HttpGet("http://api.tumblr.com/v2/user/dashboard?limit=10");
myConsumer.sign(request);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
但是,我得到的不是像我应该的那样好的 JSON 响应,而是:
10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
那我错在哪里了?谢谢
最佳答案
我已经成功地将路标库与 Appache HttpCommons GET/POST/PUT 一起使用。
首先,我使用以下代码 (ActivityLogin.java) 启动了用于登录的 WebView:
private static CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET);
private static OAuthProvider provider = new DefaultOAuthProvider (AppConfig.requestURL, AppConfig.accessURL, AppConfig.authURL);
private void logMeIn() throws ...{
String authUrl = provider.retrieveRequestToken(consumer,AppConfig.CALLBACK_URL);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
}
然后,我使用 onNewIntent(Intent) 从之前启动的 Activity 接收 OAuth 回调:
AppConfig.java 代码 fragment :
/** OAuth Authorization URL */
public static final String authURL = mainOAuthUrl+"/authorize/?theme=android";
/** OAuth Request URL */
public static final String requestURL = mainOAuthUrl+"/request/token/";
/** OAuth Access URL */
public static final String accessURL = mainOAuthUrl+"/access/token/";
/** OAuth CALLback URL*/
public static final String CALLBACK_URL = "yourapp://twitt";
ActivityLogin.java 代码 fragment :
protected void onNewIntent(Intent intent) {
Uri uri = intent.getData();
if (uri != null && uri.toString().startsWith(AppConfig.CALLBACK_URL)) {
String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
provider.retrieveAccessToken(consumer, verifier);
Data.OAuthAccessKey = consumer.getToken();
Data.OAuthAccessSecret = consumer.getTokenSecret();
}
}
然后,我的连接代码如下所示:
public HttpResponse sampleOauthConnect(String url) throws ...{
/** setup some connection params */
HttpContext context = new BasicHttpContext();
HttpRequestBase request = new HttpGet(url);
if (Data.OAuthConsumer == null)
Data.OAuthConsumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET);
if (Data.OAuthAccessKey == null || Data.OAuthAccessSecret == null)
throw new LoginErrorException(LoginErrorException.NOT_LOGGED_IN);
Data.OAuthConsumer.setTokenWithSecret(Data.OAuthAccessKey, Data.OAuthAccessSecret);
try {
Data.OAuthConsumer.sign(request);
} catch (OAuthMessageSignerException e) {
throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e);
} catch (OAuthExpectationFailedException e) {
throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e);
} catch (OAuthCommunicationException e) {
throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e);
}
HttpClient client = new DefaultHttpClient();
/** finally execute this request */
return client.execute(request, context);
}
我可能在复制粘贴过程中漏掉了一些东西,请告诉我这个解决方案是否适合您。我正在使用 singpost 1.2.1.1
关于Android Tumblr Oauth 路标 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7841936/
我在使用Twitter进行基本的omniauth身份验证时被封锁了2天。我在简单的omniauth上跟随RyanBates的railscast,但无法通过OAuth::Unauthorized401异常,当我尝试登录时引发。请帮忙!我的代码粘贴在下面:twitterinfo:website:[http://127.0.0.1:3000]callbarckurl:[http://127.0.0.1:3000/auth/twitter/callback]//路线.rbSentimentalist::Application.routes.drawdoresources:dashboard,o
我正在我的应用程序中实现一个简单的API来与Android应用程序通信。我主要尝试使用AbstractController::Metal来提高性能。我遇到的问题是渲染忽略了我传递的状态选项。非常简单的例子:classApi::V1::ApiController打电话curl-v-XGEThttp://app.dev:3000/api/v1/sessions.json我希望收到401,但我却收到200OK:>GET/api/v1/sessions.jsonHTTP/1.1>User-Agent:curl/7.30.0>Host:app.dev:3000>Accept:*/*>有什么想法吗
给定以下Rails4.2Controller:classApi::UsersController当使用RSpec3时,我尝试调用此index操作并期望状态为401,而我的状态始终为200。我得到401的唯一时刻是用head401替换index操作内容,但我想用错误401进行响应并构建一个“不错”的正文,如{error:401,message:'Unauthorised'}。为什么status::unauthorised被忽略了? 最佳答案 使用错误代码而不是它的名称:渲染json:{},状态:401
我新安装了Rails,正在尝试使用Devise设置身份验证。据我所知,我有一个非常基本的设置应该可以工作,但是每当我尝试使用默认的Devise登录表单登录时,我都会收到未经授权的错误。我确定我的凭据是正确的,因为我创建了一个用户来在控制台中进行测试,如下所示:User.new({:email=>'mark@markdavies.com.au',:priv_level=>'admin',:password=>'mypassword',:password_confirmation=>'mypassword'}).save我的用户模型:classUser我的日志:StartedPOST"/a
对于JavaScript网络应用程序(基于AngularJS),我使用PouchDB在我的服务器上复制CouchDB数据库。PouchDB中的身份验证与pouchdb-authentication配合得很好.我想通过html/js登录屏幕来管理它。但是,如果用户输入了错误的凭据,我会从CouchDB服务器收到401Unauthorized,这会导致浏览器弹出窗口要求提供凭据。我怎样才能防止这个丑陋的身份验证弹出窗口并只处理我的javascript中的所有内容?! 最佳答案 我终于找到了解决方案:编辑CouchDB配置local.in
我们尝试使用Angular和SpringBoot向我们的服务添加身份验证,但由于某些原因,我们无法“打开”并从我们知道有效的URL中获取数据Angular:this.getMismatches=function(){return$http({"async":true,"crossDomain":true,"url":GLOBALS.mismatchUrl,"method":"GET","headers":{"authorization":"BasicYWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU="}});}(目前为了测试目的,登录token是硬编码的)休息服务
最近我在我的基于Springboot和Angualr2的应用程序中引入了JWT身份验证。在那里,我尝试通过在我的Angualr代码中传递JWTtoken来执行POST请求save(jobId:number,taskId:number,note:Note){returnthis.http.post(environment.APIENDPOINT+'/jobs/'+jobId+'/tasks/'+taskId+'/notes',note,this.setHeaders()).map((response:Response)=>response.json());}privatesetHeade
我正在按预期进行初始化,使用正确的键等。即使在稍后使用Parse.Cloud.run的函数中这样做,我仍然会收到401unauthorized。有没有办法查看初始化是否正常工作?它会返回任何类型的响应吗?错误?如果是这样,我如何才能看到上述回复?初始化目前很简单:Parse.initialize("appid","javascriptkey");(withthecorrectkeysofcourse).然后我调用一个云函数:Parse.Cloud.run('testfunction',aUserObj,{success:function(result){supersonic.ui.di
这让我发疯。jQuery1.4.2,WindowsXPsp3这是我的测试。加载firefox3.5+http://plungjan.name/test/testcors.html作品将文件保存到硬盘并从那里运行从我的办公室看,外部工作,内部不工作同样有趣的是,我无法同时运行两者。背景:我对使用CORS的内部Web服务执行GET.请不要发布任何关于FF自v3.5以来不处理跨域请求的答案,详见here和here它在IE8和FF3.6.6中工作,从一台服务器到另一台服务器,现在几乎从文件系统(file:///)到服务。仅来自文件系统并且仅当FF3.6.6需要协商时(用户已经登录、授权并发送凭
我想从位于domainB.contoso.com的Web应用程序访问位于domainA.contoso.com的listdata.svc(共享点服务)-身份验证似乎是个问题。当尝试通过JQueryAjax调用访问ListData.svc时,启用了CORS,服务器返回401。如果我从我从SharePoint内部执行的.htm页面运行相同的查询,调用工作正常,因为域是相同的。SharePoint使用关闭匿名身份验证的NTLM-我认为401是Windows凭据未传递到SharePoint服务器的结果-但我不知道如何将这些凭据正确添加到header。我已设置xhrFields:{withCre