使用自定义选项卡在 android 应用程序中进行 SSO Web 登录
SSO web login in android app with customtabs
我正在尝试使用 customtabs 从网页获取登录令牌。
据我了解,每次在 cutomtabs 上打开 link 都会启动一个意图,然后我可以
设置一个 Intent 过滤器,以便在我需要时返回到我的应用程序。
应用程序在自定义选项卡中启动登录页面
用户输入他的 login/mdp
页面重定向到 https://myapp.companyname.fr/redirect?token=qzdioqzj,qzi,dqzid
该应用程序应该重新启动
我在 activity 中设置了 chrometabs :
public class AuthenticationActivity extends BasicActivity {
private AuthenticationVm authenticationVm;
private ActivityAuthenticationBinding binding;
private CustomTabsServiceConnection mConnection;
private CustomTabsClient mClient;
private String authToken ;
@Override
protected void onCreate(Bundle savedInstanceState) {
App.setAfterAuthentication(false);
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_authentication);
this.setFinishOnTouchOutside(false);
authenticationVm = new AuthenticationVm(this);
binding.setVm(authenticationVm);
if (null != getUriContainedInIntend()) {
this.authToken = getTokenFromIntent();
} else {
launchCustomTabs();
mConnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient customTabsClient) {
mClient = customTabsClient;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mClient = null;
}
};
// force to use chrome
String packageName = "com.android.chrome";
CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}
}
public void launchCustomTabs() {
String urlToInterrogate = getString(R.string.sso_api_base_url) +
getString(R.string.sso_api_authorize_endpoint);
String rerirectUri = getString(R.string.sso_redirect_uri_scheme)
+ "://"
+ getString(R.string.sso_redirect_uri_host)
+ getString(R.string.sso_redirect_uri_path);
StringBuilder url = new StringBuilder(urlToInterrogate);
url.append("?client_id=");
url.append(getString(R.string.sso_api_client_id));
url.append("&response_type=code");
url.append("&redirect_uri=");
url.append(rerirectUri);
CustomTabsIntent.Builder mBuilder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = mBuilder.build();
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
customTabsIntent.launchUrl(this, Uri.parse(url.toString()));
}
private Uri getUriContainedInIntend() {
return getIntent().getData();
}
/**
* Methode interceptant l'intent pour en extraire le token
* @return token String
*/
private String getTokenFromIntent() {
Uri data = getUriContainedInIntend();
String uri = data.toString();
return uri.substring( uri.indexOf("#access_token=") + "#access_token=".length(), uri.indexOf("&expires_in="));
}
/**
* Récupère la propriété binding.
*
* @return la valeur de binding
*/
public ActivityAuthenticationBinding getBinding() {
return binding;
}
}
在清单中我添加了这个来捕捉意图:
<activity android:name=".ui.AuthenticationActivity"
android:screenOrientation="sensorLandscape"
android:launchMode="singleTop"
android:noHistory="true"
android:theme="@style/NoTitleDialog">
<!-- to catch the sso return -->
<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="@string/sso_redirect_uri_host"
android:path="@string/sso_redirect_uri_path"
android:scheme="@string/sso_redirect_uri_scheme" />
</intent-filter>
</activity>
在 strings.xml 我有:
<!-- SSO -->
<string name="sso_redirect_uri_scheme" translatable="false">https</string>
<string name="sso_redirect_uri_host" translatable="false">myapp.companyname.fr</string>
<string name="sso_redirect_uri_path" translatable="false">/redirect</string>
<string name="sso_api_base_url" translatable="false">https://gw.okm.test.com</string>
<string name="sso_api_authorize_endpoint" translatable="false">/v1/oauth2/authorize</string>
<string name="sso_api_token_endpoint" translatable="false">/v1/oauth2/token</string>
<string name="sso_api_client_id" translatable="false">qzd16q5d156qd1qzd1qz61zq5615d1q6d1z</string>
<string name="sso_api_client_secret" translatable="false">qzd1q6d1q56d1q6d1q1qz6d1zd65qz1dz51</string>
然而,登录后用户确实被重定向到:https://myapp.companyname.fr/redirect?token=qz561dqz56d1qz5dqzd
但是 activity.
没有捕捉到意图
我是不是做错了什么?
尝试使用自定义架构而不是 https。
示例:
<string name="sso_redirect_uri_scheme" translatable="false">myschema</string>
然后,确保您的 Web 应用重定向到 myschema://myapp.companyname.fr/redirect?token=qzdioqzj,qzi,dqzid
因为打开URL需要用到这个:
CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", connection);
我正在尝试使用 customtabs 从网页获取登录令牌。
据我了解,每次在 cutomtabs 上打开 link 都会启动一个意图,然后我可以 设置一个 Intent 过滤器,以便在我需要时返回到我的应用程序。
应用程序在自定义选项卡中启动登录页面 用户输入他的 login/mdp 页面重定向到 https://myapp.companyname.fr/redirect?token=qzdioqzj,qzi,dqzid 该应用程序应该重新启动
我在 activity 中设置了 chrometabs :
public class AuthenticationActivity extends BasicActivity {
private AuthenticationVm authenticationVm;
private ActivityAuthenticationBinding binding;
private CustomTabsServiceConnection mConnection;
private CustomTabsClient mClient;
private String authToken ;
@Override
protected void onCreate(Bundle savedInstanceState) {
App.setAfterAuthentication(false);
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_authentication);
this.setFinishOnTouchOutside(false);
authenticationVm = new AuthenticationVm(this);
binding.setVm(authenticationVm);
if (null != getUriContainedInIntend()) {
this.authToken = getTokenFromIntent();
} else {
launchCustomTabs();
mConnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient customTabsClient) {
mClient = customTabsClient;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mClient = null;
}
};
// force to use chrome
String packageName = "com.android.chrome";
CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}
}
public void launchCustomTabs() {
String urlToInterrogate = getString(R.string.sso_api_base_url) +
getString(R.string.sso_api_authorize_endpoint);
String rerirectUri = getString(R.string.sso_redirect_uri_scheme)
+ "://"
+ getString(R.string.sso_redirect_uri_host)
+ getString(R.string.sso_redirect_uri_path);
StringBuilder url = new StringBuilder(urlToInterrogate);
url.append("?client_id=");
url.append(getString(R.string.sso_api_client_id));
url.append("&response_type=code");
url.append("&redirect_uri=");
url.append(rerirectUri);
CustomTabsIntent.Builder mBuilder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = mBuilder.build();
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
customTabsIntent.launchUrl(this, Uri.parse(url.toString()));
}
private Uri getUriContainedInIntend() {
return getIntent().getData();
}
/**
* Methode interceptant l'intent pour en extraire le token
* @return token String
*/
private String getTokenFromIntent() {
Uri data = getUriContainedInIntend();
String uri = data.toString();
return uri.substring( uri.indexOf("#access_token=") + "#access_token=".length(), uri.indexOf("&expires_in="));
}
/**
* Récupère la propriété binding.
*
* @return la valeur de binding
*/
public ActivityAuthenticationBinding getBinding() {
return binding;
}
}
在清单中我添加了这个来捕捉意图:
<activity android:name=".ui.AuthenticationActivity"
android:screenOrientation="sensorLandscape"
android:launchMode="singleTop"
android:noHistory="true"
android:theme="@style/NoTitleDialog">
<!-- to catch the sso return -->
<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="@string/sso_redirect_uri_host"
android:path="@string/sso_redirect_uri_path"
android:scheme="@string/sso_redirect_uri_scheme" />
</intent-filter>
</activity>
在 strings.xml 我有:
<!-- SSO -->
<string name="sso_redirect_uri_scheme" translatable="false">https</string>
<string name="sso_redirect_uri_host" translatable="false">myapp.companyname.fr</string>
<string name="sso_redirect_uri_path" translatable="false">/redirect</string>
<string name="sso_api_base_url" translatable="false">https://gw.okm.test.com</string>
<string name="sso_api_authorize_endpoint" translatable="false">/v1/oauth2/authorize</string>
<string name="sso_api_token_endpoint" translatable="false">/v1/oauth2/token</string>
<string name="sso_api_client_id" translatable="false">qzd16q5d156qd1qzd1qz61zq5615d1q6d1z</string>
<string name="sso_api_client_secret" translatable="false">qzd1q6d1q56d1q6d1q1qz6d1zd65qz1dz51</string>
然而,登录后用户确实被重定向到:https://myapp.companyname.fr/redirect?token=qz561dqz56d1qz5dqzd 但是 activity.
没有捕捉到意图我是不是做错了什么?
尝试使用自定义架构而不是 https。
示例:
<string name="sso_redirect_uri_scheme" translatable="false">myschema</string>
然后,确保您的 Web 应用重定向到 myschema://myapp.companyname.fr/redirect?token=qzdioqzj,qzi,dqzid
因为打开URL需要用到这个:
CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", connection);