FitBark Oauth授权码重定向陷入困境

时间:2017-06-18 23:29:10

标签: android redirect oauth-2.0 authorization

Android的新手,用FitBark API练习三足Oauth。我让它在Android Studio之外工作。

  1. First Leg,Chrome浏览器,成功进入用户允许访问应用程序屏幕并获取授权代码。
  2. 第二条腿,使用授权码的POSTMAN,成功获取访问令牌。
  3. 第三条腿,使用带有访问令牌的终端中的curl,成功返回带有Get User Info API端点的用户配置文件信息的JSON。
  4. 在Android Studio中不起作用:

    我陷入了Android Studio的第一站。我正在使用Retrofit Oauth tutorial

    我可以启动First Leg,App在浏览器中打开FitBark登录屏幕,我可以以用户身份登录。

    enter image description here

    一旦完成,浏览器将重定向到另一个页面并显示授权代码。

    enter image description here

    但是,我不希望它打开浏览器并显示身份验证代码。我希望它在登录/允许访问后重定向回App。一旦它重定向回我的应用程序,我的理解是我可以捕获Intent中的响应(我假设是auth代码)并使用.getData()获取它。

    改进指南以及堆栈和其他地方的各种来源都指向在Android Manifest中添加特定代码,在Intent过滤器中,在我启动First Leg调用的Activity下。

    我的凭据附带的FitBark redirect_uri:

    urn:ietf:wg:oauth:2.0:oob设置为常量FITBARK_REDIRECT

    在我的登录活动(在onCreate中)中进行测试以获取授权代码:

    public void getAuthCode(){
            Intent intent = new Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse(ServiceGenerator.FITBARK_BASE_URL + "/authorize?response_type=code&client_credentials&" + "client_id=" +FITBARK_CLIENT_ID + "&redirect_uri=" + FITBARK_REDIRECT));
            startActivity(intent);
        }
    

    我在登录活动中的onResume,它应该从Intent获取数据。这段代码确实触发了,但我从getIntent.getData()得到了空。

    @Override
        protected void onResume() {
    
            super.onResume();
            // the intent filter defined in AndroidManifest will handle the return from ACTION_VIEW intent
            Uri uri = getIntent().getData();
            if (uri == null){
                Log.d("On RESUME", "Gets Here");
    
            }
            if (uri != null && uri.toString().startsWith(intentRedirect)) {
                // use the parameter your API exposes for the code (mostly it's "code")
                String code = uri.getQueryParameter("code");
                Log.d("CODE", code);
                if (code != null) {
                    // get access token
                    // we'll do that in a minute
                } else if (uri.getQueryParameter("error") != null) {
                    Log.d("ERROR URI", "ERROR ERROR ERROR");
                }
            }
        }
    

    我的Android清单

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.macbook.retrofit">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".LoginActivity">
                <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="app.open"
                    android:scheme="myapp" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

    根据阅读指南,我的理解是android:host,而android:scheme需要与FitBark首回合调用中的redirect_uri相匹配。所以我通过将myapp://app.open添加到调用中来尝试。

    Uri.parse(ServiceGenerator.FITBARK_BASE_URL + "/authorize?response_type=code&client_credentials&" + "client_id=" +FITBARK_CLIENT_ID + "&redirect_uri=" + "myapp://app.open"));
        startActivity(intent);
    

    在添加“myapp://app.open”之前,我通过终端通过FitBark的API将其设置为自定义重定向。

    curl -X POST -H "Authorization: Bearer <My Token Value goes Here>" -H 
    "Content-Type: application/json" -d 
    '{"redirect_uri":"urn:ietf:wg:oauth:2.0:oob\rmyapp://app.open"}' 
    "https://app.fitbark.com/api/v2/redirect_urls"
    

    循环:

    当我单击按钮(在Main上)以启动Login Activity时,getAuthCode()将在onCreate of Login中触发。浏览器打开然后陷入循环。

    所以,那就是我所处的位置。我想获得授权码并在第二站使用它,但我无法弄明白。请帮忙!!!

    enter image description here

1 个答案:

答案 0 :(得分:0)

想出来,谢谢你和我一起使用橡胶:)

我在活动的onCreate中有getAuthCode() ...

活动调用getAuth getAuth重定向回Activity ...再次onCreates ...

咄。