AndroidApp使用Web達成第三方認證

在日常中,可以見到有許多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){

    }
}

五、效果展示