【问题标题】:iOS Device Check - Server Side C# .net solution (JWT)iOS 设备检查 - 服务器端 C# .net 解决方案 (JWT)
【发布时间】:2020-12-06 15:33:22
【问题描述】:

在 iOS 上设置 DeviceCheck 非常简单,但使用 C# 实现服务器端却很困难,因为几乎没有任何示例,并且需要一些棘手的 JWT 代码,它必须绝对完美才能正常工作。有人有解决办法吗?

【问题讨论】:

    标签: c# ios .net swift jwt


    【解决方案1】:

    这是一个完整的解决方案。我从 p8 文件中删除了第一行和最后一行,例如“钥匙从这里开始”(或其他)并取出所有新行,以便钥匙只是一条长线

    static void Main(string[] args)
    {
        string deviceToken = ""; //you get this from the device
        string transcationId = Guid.NewGuid().ToString();
    
        var payload = new Dictionary<string, object>() {
            { "device_token", deviceToken },
            { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 },
            { "transaction_id", transcationId }
        };
    
      
        var token = GetProviderToken();
        var payloadJson = JsonConvert.SerializeObject(payload);
    
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.development.devicecheck.apple.com/v1/query_two_bits"))
            {
                request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {token}");
    
                request.Content = new StringContent(payloadJson);
                request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
    
                var response = httpClient.SendAsync(request).Result;                    
                Console.WriteLine(response);
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
            }
        }
    }
    
    private static CngKey GetPrivateKey()
    {
        using (var reader = File.OpenText(@".\applekey.p8.txt"))
        {
            var ecPrivateKeyParameters = (ECPrivateKeyParameters)new PemReader(reader).ReadObject();
            var x = ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded();
            var y = ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded();
            var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned();
            return EccKey.New(x, y, d);
        }
    }
    
    private static string GetProviderToken()
    {
        var epochNow = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
        var payload = new Dictionary<string, object>()
        {
            {"iss", "<10 DIGIT TEAM CODE FROM APPLE DEV CENTER>"},
            {"iat", epochNow}
        };
        var extraHeaders = new Dictionary<string, object>()
        {
            {"kid", "<THE NAME OF THE P8 FILE, 10 DIGITS>"}
        };
        var privateKey = GetPrivateKey();
        return JWT.Encode(payload, privateKey, JwsAlgorithm.ES256, extraHeaders);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 2017-08-26
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多