啟用跨應用程式和網站的自動登入功能

如果您的應用程式使用密碼專用 Smart Lock,和您的網站共用使用者資料庫,或者您的應用程式和網站使用 Google 登入等聯合登入供應商,那麼您可以將該應用程式與網站建立關聯,讓使用者儲存憑證一次,然後自動登入應用程式和網站。

如要將應用程式與網站建立關聯,請在網站上代管 Digital Asset Links JSON 檔案來宣告關聯,並在應用程式的資訊清單中新增 Digital Asset Link 檔案的連結。

在網站上代管 Digital Asset Links 宣告後,網站就能在 Android 8.0 以上版本執行時,與應用程式共用自動填入資料。

必要條件

網站的登入網域必須透過 HTTPS 存取。

為應用程式和網站建立關聯

  1. 建立 Digital Asset Links JSON 檔案。

    舉例來說,如要宣告網站 https://signin.example.com 和含有套件名稱 com.example 的 Android 應用程式可以共用登入憑證,請建立名為 assetlinks.json 的檔案,其中含有以下內容:

    [{
      "relation": ["delegate_permission/common.get_login_creds"],
      "target": {
        "namespace": "web",
        "site": "https://signin.example.com"
      }
     },
     {
      "relation": ["delegate_permission/common.get_login_creds"],
      "target": {
        "namespace": "android_app",
        "package_name": "com.example",
        "sha256_cert_fingerprints": [
          "F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
        ]
      }
     }]
    

    relation 欄位是一或多個字串陣列,用來描述要宣告的關係。如要宣告應用程式和網站共用登入憑證,請指定 delegate_permission/common.get_login_creds 字串。

    target 欄位是一種物件,用於指定宣告所適用的資產。下列欄位可用來識別網站:

    namespace web
    site

    網站網址,格式為 https://domain[:optional_port],例如 https://www.example.com

    domain 必須完整,且使用 HTTPS 通訊埠 443 時,必須省略 optional_port

    site 指定目標只能是根網域:您無法限制應用程式與特定子目錄建立關聯。請勿在網址中加入路徑,例如結尾的斜線。

    系統不會將子網域視為相符項目:也就是說,如果將 domain 指定為 www.example.com,網域 www.counter.example.com 就不會與您的應用程式建立關聯。

    下列欄位可用來識別 Android 應用程式:

    namespace android_app
    package_name 應用程式資訊清單中宣告的套件名稱。例如:com.example.android
    sha256_cert_fingerprints 應用程式簽署憑證的 SHA256 指紋。您可以使用下列指令產生指紋:
    $ keytool -list -v -keystore my-release-key.keystore

    詳情請參閱「Digital Asset Links 參考資料」。

  2. 請在登入網域的以下位置代管 Digital Assets Link JSON 檔案:

    https://domain[:optional_port]/.well-known/assetlinks.json

    舉例來說,如果您的登入網域是 signin.example.com,請在 https://signin.example.com/.well-known/assetlinks.json 代管 JSON 檔案。

    Digital Assets Link 檔案的 MIME 類型必須為 JSON。確認伺服器會在回應中傳送 Content-Type: application/json 標頭。

  3. 確保主機允許 Google 擷取您的 Digital Asset Link 檔案。如果您有 robots.txt 檔案,必須允許 Googlebot 代理程式擷取 /.well-known/assetlinks.json。大多數網站會直接允許所有自動化代理程式擷取 /.well-known/ 路徑中的檔案,讓其他服務存取這些檔案內的中繼資料:

    User-agent: *
    Allow: /.well-known/
    

  4. 在 Android 應用程式中宣告關聯。

    1. <application> 底下的資訊清單檔案中新增下列程式碼:

        <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
      
    2. strings.xml 檔案中加入 asset_statements 字串資源。asset_statements 字串是 JSON 物件,指定要載入的 assetlinks.json 檔案。您必須逸出在字串中使用的所有格號和引號。例如:

        <string name="asset_statements" translatable="false">
        [{
          \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
        }]
        </string>
      
        > GET /.well-known/assetlinks.json HTTP/1.1
        > User-Agent: curl/7.35.0
        > Host: signin.example.com
      
        < HTTP/1.1 200 OK
        < Content-Type: application/json
      
  5. 將應用程式發布到 Google Play 商店。必須在公開管道發布,系統才能接收關聯資料。

  6. (選用) 填寫並提交 密碼專用 Smart Lock 關聯表單,表示您已完成驗證程序。Google 會定期檢查透過表單提交的關聯是否確實有效,發生問題時可能會與您聯絡。

驗證程序完成後,應用程式使用者就能將自己的憑證儲存在應用程式或網站,並自動登入兩者。

範例:將多個應用程式與網站建立關聯

您可以在 Digital Assets Link 檔案中指定每個應用程式,將多個應用程式與網站建立關聯。舉例來說,如要將 com.examplecom.example.pro 應用程式與 https://signin.example.com/ 的網站建立關聯,請在 https://signin.example.com/.well-known/assetlinks.json 代管的 JSON 檔案中指定兩個應用程式:

[{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "web",
    "site": "https://signin.example.com"
  }
},{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
    ]
  }
},{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.pro",
    "sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
    ]
  }
}]

然後在兩個應用程式中宣告關聯:

  1. <application> 底下的資訊清單檔案中新增下列程式碼:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  2. strings.xml 檔案中加入下列字串資源:

    <string name="asset_statements" translatable="false">
    [{
      \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
    }]
    </string>
    

範例:將應用程式與多個網站建立關聯

您可以將應用程式與多個網站建立關聯,方法是在 Digital Assets Link 檔案中指定每個網站,然後在每個網站上託管檔案。舉例來說,如要將 com.examplecom.example.pro 應用程式與 https://signin.example.com/https://m.example.com/ 網站建立關聯,請在 https://signin.example.com/.well-known/assetlinks.json 代管的 JSON 檔案中同時指定應用程式和兩個網站:

[{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "web",
    "site": "https://signin.example.com"
  }
},{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "web",
    "site": "https://m.example.com"
  },
},{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
    ]
  }
},{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.pro",
    "sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
    ]
  }
}]

然後在託管於 https://m.example.com/.well-known/assetlinks.json 的 JSON 檔案中,加入主要 Digital Asset Links 檔案:

[{
  "include": "https://signin.example.com/.well-known/assetlinks.json"
}]

最後,在兩個應用程式中宣告關聯:

  1. <application> 底下的資訊清單檔案中新增下列程式碼:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  2. strings.xml 檔案中加入下列字串資源:

    <string name="asset_statements" translatable="false">
    [{
      \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
    }]
    </string>