Android的新手,用FitBark API练习三足Oauth。我让它在Android Studio之外工作。
在Android Studio中不起作用:
我陷入了Android Studio的第一站。我正在使用Retrofit Oauth tutorial。
我可以启动First Leg,App在浏览器中打开FitBark登录屏幕,我可以以用户身份登录。
一旦完成,浏览器将重定向到另一个页面并显示授权代码。
但是,我不希望它打开浏览器并显示身份验证代码。我希望它在登录/允许访问后重定向回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中触发。浏览器打开然后陷入循环。
所以,那就是我所处的位置。我想获得授权码并在第二站使用它,但我无法弄明白。请帮忙!!!
答案 0 :(得分:0)
想出来,谢谢你和我一起使用橡胶:)
我在活动的onCreate中有getAuthCode()
...
活动调用getAuth getAuth重定向回Activity ...再次onCreates ...
咄。