草庐IT

Android Tumblr Oauth 路标 401

coder 2023-12-15 原文

好的,所以,我正在为 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/

有关Android Tumblr Oauth 路标 401的更多相关文章

  1. ruby-on-rails - rails 中的 Omniauth-twitter:OAuth::Unauthorized 401 - 2

    我在使用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

  2. ruby-on-rails - Rails 4 AbstractController::Metal 渲染状态 != 200(即 401、404) - 2

    我正在我的应用程序中实现一个简单的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:*/*>有什么想法吗

  3. ruby-on-rails - 使用 Rails 4 响应未授权 (401) 状态 - 2

    给定以下Rails4.2Controller:classApi::UsersController当使用RSpec3时,我尝试调用此index操作并期望状态为401,而我的状态始终为200。我得到401的唯一时刻是用head401替换index操作内容,但我想用错误401进行响应并构建一个“不错”的正文,如{error:401,message:'Unauthorised'}。为什么status::unauthorised被忽略了? 最佳答案 使用错误代码而不是它的名称:渲染json:{},状态:401

  4. ruby-on-rails - 新安装的 Rails + Devise 总是得到 401 Unauthorized - 2

    我新安装了Rails,正在尝试使用Devise设置身份验证。据我所知,我有一个非常基本的设置应该可以工作,但是每当我尝试使用默认的Devise登录表单登录时,我都会收到未经授权的错误。我确定我的凭据是正确的,因为我创建了一个用户来在控制台中进行测试,如下所示:User.new({:email=>'mark@markdavies.com.au',:priv_level=>'admin',:password=>'mypassword',:password_confirmation=>'mypassword'}).save我的用户模型:classUser我的日志:StartedPOST"/a

  5. javascript - 使用 CouchDB PouchDB 防止身份验证弹出窗口 401 - 2

    对于JavaScript网络应用程序(基于AngularJS),我使用PouchDB在我的服务器上复制CouchDB数据库。PouchDB中的身份验证与pouchdb-authentication配合得很好.我想通过html/js登录屏幕来管理它。但是,如果用户输入了错误的凭据,我会从CouchDB服务器收到401Unauthorized,这会导致浏览器弹出窗口要求提供凭据。我怎样才能防止这个丑陋的身份验证弹出窗口并只处理我的javascript中的所有内容?! 最佳答案 我终于找到了解决方案:编辑CouchDB配置local.in

  6. javascript - 预检响应具有无效的 HTTP 状态代码 : 401 angular - 2

    我们尝试使用Angular和SpringBoot向我们的服务添加身份验证,但由于某些原因,我们无法“打开”并从我们知道有效的URL中获取数据Angular:this.getMismatches=function(){return$http({"async":true,"crossDomain":true,"url":GLOBALS.mismatchUrl,"method":"GET","headers":{"authorization":"BasicYWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU="}});}(目前为了测试目的,登录token是硬编码的)休息服务

  7. javascript - HTTP 状态代码 401,即使我在请求中发送凭据 - 2

    最近我在我的基于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

  8. javascript - 使用 Parse.com javascript 并保持 401 未经授权 - 2

    我正在按预期进行初始化,使用正确的键等。即使在稍后使用Parse.Cloud.run的函数中这样做,我仍然会收到401unauthorized。有没有办法查看初始化是否正常工作?它会返回任何类型的响应吗?错误?如果是这样,我如何才能看到上述回复?初始化目前很简单:Parse.initialize("appid","javascriptkey");(withthecorrectkeysofcourse).然后我调用一个云函数:Parse.Cloud.run('testfunction',aUserObj,{success:function(result){supersonic.ui.di

  9. javascript - 请帮助测试 401 时 Firefox jQuery ajax 中的 CORS 问题 - 2

    这让我发疯。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需要协商时(用户已经登录、授权并发送凭

  10. javascript - 尝试为 SharePoint 实现 CORS 时出现 401 - 2

    我想从位于domainB.contoso.com的Web应用程序访问位于domainA.contoso.com的listdata.svc(共享点服务)-身份验证似乎是个问题。当尝试通过JQueryAjax调用访问ListData.svc时,启用了CORS,服务器返回401。如果我从我从SharePoint内部执行的.htm页面运行相同的查询,调用工作正常,因为域是相同的。SharePoint使用关闭匿名身份验证的NTLM-我认为401是Windows凭据未传递到SharePoint服务器的结果-但我不知道如何将这些凭据正确添加到header。我已设置xhrFields:{withCre

随机推荐