【问题标题】:Google API Key restriction on Xamarin MAUI iOS, Android ( Denied Bundle Identifier with Sha-1 )Xamarin MAUI iOS、Android 上的 Google API 密钥限制(拒绝使用 Sha-1 的捆绑标识符)
【发布时间】:2022-01-04 10:32:41
【问题描述】:

我们希望在 Xamarin iOS、Android 应用中限制 Google Api Keys。

当我们限制它们访问Google Cloud 时,api 拒绝了我们的请求

为什么它不起作用?

【问题讨论】:

    标签: android ios google-api api-key maui


    【解决方案1】:

    原因: 我在我的 api 请求期间没有提供正确的信息

    我们在 Google cloud 中添加了对包标识符和 Android Sha-1 签名的限制。

    所以在Header request里面,我们需要发送这个信息

    using Xamarin.Essentials;
    
    //For iOS
    Headers.Add("X-Ios-Bundle-Identifier", AppInfo.PackageName) 
    
    //For Android
    Headers.Add("X-Android-Package", AppInfo.PackageName)
    Headers.Add("X-Android-Cert", DependencyService.Get<ISignatureHashService>().GetSha1() })
    

    为了获得 Sha-1 签名,我使用了您需要实现它的 DependencyService

            public string GetSha1()
            {
                var Context = Android.App.Application.Context;
    
                if (Build.VERSION.SdkInt >= BuildVersionCodes.P)
                {
                    PackageInfo packageInfo = Context.PackageManager.GetPackageInfo(Context.PackageName, PackageInfoFlags.SigningCertificates);
                    if (packageInfo == null || packageInfo.SigningInfo == null)
                        return string.Empty;
    
                    var signature = packageInfo.SigningInfo.GetSigningCertificateHistory().FirstOrDefault();
                    if (signature != null)
                    {
                        return SignatureDigest(signature);
                    }
    
                }
                else
                {
                    PackageInfo packageInfo = Context.PackageManager.GetPackageInfo(Context.PackageName, PackageInfoFlags.Signatures);
                    if (packageInfo == null || packageInfo.Signatures == null)
                        return string.Empty;
    
                    var signature = Context.PackageManager.GetPackageInfo(Context.PackageName, PackageInfoFlags.Signatures).Signatures.FirstOrDefault();
                    if (signature != null)
                        return SignatureDigest(signature);
                }
                return string.Empty;
            }
    
            private static string SignatureHexa(Android.Content.PM.Signature signature)
            {
                using (SHA1Managed sha1 = new SHA1Managed())
                {
                    var hash = sha1.ComputeHash(signature.ToByteArray());
                    var sb = new StringBuilder(hash.Length * 2);
                    foreach (byte b in hash)
                    {
                        sb.Append(b.ToString("X2"));
                    }
                    return sb.ToString();
                }
            }
    

    对我来说,我的应用是通过 GooglePlay 签名的,所以我不需要多个签名

    但如果您需要检查多个签名者

    if (packageInfo.SigningInfo.HasMultipleSigners)
       {
         foreach (Signature signature in packageInfo.SigningInfo.GetApkContentsSigners())
            {
                //Dostuff
                SignatureHexa(signature);
            }
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多