在日常中,可以見到有許多APP的會員機制使用Facebook、Google作為第三方驗證,直接透過這些服務提供的GUI進行登入,程式只要專心在驗證後取得的資料處理就好。
從上面可以大概知道,如果APP要使用第三方驗證,那就需要驗證服務提供者要有自己的APP,這樣才能開啟對應的登入或授權視窗。
如果你所在的單位並沒有這類驗證服務的手機客戶端+SDK,實作上比較麻煩點。
不過Android中的Intent以及URL Schema為我們提供了一個解決方式,我們可以針對APP設定與之對應的URL Schema(例如:http使用瀏覽器開啟);總體而言是在OAuth過程中的Redirect_Uri,重導向到需要認證的APP定義的URL格式(例如:nkfust://login?token=XXXX),藉此啟動APP並且由APP讀取此段URL的內容進行後續的處理。
一、定義Schema
在這個範例中我們定義登入驗證的URI為 nkfust://login?token=XXX
二、設定驗證提供者之redirect_uri
此步驟需要再自己單位或所需的認證提供者服務進行設定,將驗證成功後的結果導引至前項所定義的URL(nkfust://login
),並且假設這個服務會自動在後面串接上QueryString的參數token(當然這方面就要看使用的服務怎麼串)。
三、設定AndroidManifest.xml
將登入成功後接收與處理token資訊的Activity項目設定intent-filter並設定schema名稱與相關參數。
<activity android:name=".MainActivity" >
<intent-filter> <!--#region 原本的東西-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter><!--#endregion 原本的東西-->
<intent-filter>
<action android:name="android.intent.action.VIEW"/> <!--可透過URI觸發檢視-->
<category android:name="android.intent.category.BROWSABLE"/><!--類別測試:可透過瀏覽器開啟>-->
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="nkfust" /><!--Schema名稱-->
</intent-filter>
</activity>
四、APP接收與處理URI內容
在上面選定的Activity中,可以透過getIntent()取得傳入的相關資訊,本範例則是直接將hostName作為標題,token參數則直接顯示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = (TextView)findViewById(R.id.textView1);//用來顯示token的
try {
Intent intent = getIntent();//取出Intent
Uri url = intent.getData();//取出啟動的URL
setTitle(url.getHost());//把host當標題顯示
if (url.getHost().equals("login")) {//可以透過host來設定多種不同動作
textView1.setText(url.getQueryParameter("token"));//取出token值
//這裡可以搭配WebService驗證token合法...
}
}catch(Exception e){
}
}
五、效果展示