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

如果應用程式使用密碼專用 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,請將 JSON 檔案託管在 https://signin.example.com/.well-known/assetlinks.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>