久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

invalid_client 用于使用蘋果登錄

invalid_client for sign in with apple(invalid_client 用于使用蘋果登錄)
本文介紹了invalid_client 用于使用蘋果登錄的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想達到的目標:

  • iOS 客戶端向后端發送 JWT 令牌.
  • 后端 (Java) 調用 https://appleid.apple.com/auth/token驗證令牌.

到目前為止我所擁有的:

撥打 Apple 驗證電話:

 restTemplate = new RestTemplate();HttpHeaders 標頭 = 新的 HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);多值映射<字符串,字符串>map = new LinkedMultiValueMap<>();map.add("client_id", clientId);//app_id 像 com.app.id字符串令牌 = generateJWT();//生成的 jwtmap.add("client_secret", token);map.add("grant_type", "authorization_code");map.add("code", authorizationCode);//我們從 iOS 獲得的 JWT 代碼HttpEntity<MultiValueMap<字符串,字符串>>request = new HttpEntity<>(map, headers);最終字符串 appleAuthURL = "https://appleid.apple.com/auth/token";字符串響應 = restTemplate.postForObject(appleAuthURL, request, String.class);

代幣生成:

 final PrivateKey privateKey = getPrivateKey();最終 int 到期 = 1000 * 60 * 5;字符串令牌 = Jwts.builder().setHeaderParam(JwsHeader.KEY_ID, keyId)//我從 Apple 獲得的密鑰 id.setIssuer(teamId).setAudience("https://appleid.apple.com").setSubject(clientId)//應用 id com.app.id.setExpiration(new Date(System.currentTimeMillis() + expire)).setIssuedAt(新日期(System.currentTimeMillis())).signWith(SignatureAlgorithm.ES256, privateKey)//ECDSA 使用 P-256 和 SHA-256.袖珍的();返回令牌;

從文件中獲取我的私鑰:

 final Reader pemReader = new StringReader(getKeyData());最終 PEMParser pemParser = 新 PEMParser(pemReader);最終 JcaPEMKeyConverter 轉換器 = 新 JcaPEMKeyConverter();最終 PrivateKeyInfo 對象 = (PrivateKeyInfo) pemParser.readObject();最終 PrivateKey pKey = converter.getPrivateKey(object);

我確認我的 JWT 具有所有必填字段:

<代碼>{"kid": "與我的鑰匙 ID 相同的鑰匙",alg":ES256"}{"iss": "廢話","aud": "https://appleid.apple.com",子":com.app.id",exp":1578513833,iat":1578513533}

解決方案

這行引起了我的注意:

map.add("code", authorizationCode);//我們從 iOS 獲得的 JWT 代碼

authorizationCode 不是 jwt

JSON Web Tokens 由 3 個部分組成,用點分隔

authorizationCode 有 4 個部分,如下所示:

text1.text2.0.text3

您可能正在使用 iOS 應用程序中的 identityToken 而不是 authorizationCode

這是您檢索它的方式:

let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)!打印(授權碼:(授權碼)")

對于那些在遇到相同的 invalid_client 錯誤后可能來到這里的人來說,記住以下幾點也很好:

<塊引用>

  1. kid 是 developer.apple.com/account/resources/authkeys/list 中私鑰的 ID

  2. keyFile 是保存從 developer.apple.com 下載的私鑰的文件

  3. 登錄developer.apple.com點擊賬號可以找到teamID,右上角可以看到teamID

  4. aud 中的值應該是https://appleid.apple.com

  5. app_id 是應用程序的包標識符

如果它可能有幫助,這里有一個在 python 中創建 client_secret 的可行解決方案:

# $ pip install pyjwt導入 jwt進口時間孩子=myKeyId"keyFile = "/pathToFile/AuthKey.p8";鍵="使用 open(keyFile, 'r') 作為 myFile:鍵 = myFile.read()打印(鍵)timeNow = int(round(time.time()))time3Months = timeNow + 86400*90索賠= {'iss':團隊ID,'iat':時間現在,'exp': time3Months,'aud': 'https://appleid.apple.com',子":app_id,}秘密= jwt.encode(聲明,密鑰,算法='ES256',標題={'kid':kid})打印(秘密:")打印(秘密)client_secret = secret.decode("utf-8")打印(client_secret)

What I try to achieve:

  • iOS client sends a JWT token to the backend.
  • Backend (Java) calls https://appleid.apple.com/auth/token to verify the token.

what I have so far:

to make Apple verification call:

        restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("client_id", clientId); // app_id like com.app.id
        String token = generateJWT();   // generated jwt
        map.add("client_secret", token); 
        map.add("grant_type", "authorization_code");
        map.add("code", authorizationCode);  // JWT code we got from iOS
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);

        final String appleAuthURL = "https://appleid.apple.com/auth/token";
        String response = restTemplate.postForObject(appleAuthURL, request, String.class);

token generation:

        final PrivateKey privateKey = getPrivateKey();
        final int expiration = 1000 * 60 * 5;

        String token = Jwts.builder()
                .setHeaderParam(JwsHeader.KEY_ID, keyId) // key id I got from Apple 
                .setIssuer(teamId)  
                .setAudience("https://appleid.apple.com")
                .setSubject(clientId) // app id com.app.id
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .signWith(SignatureAlgorithm.ES256, privateKey) // ECDSA using P-256 and SHA-256
                .compact();

        return token;

to get my private key from the file:

        final Reader pemReader = new StringReader(getKeyData());
        final PEMParser pemParser = new PEMParser(pemReader);
        final JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        final PrivateKeyInfo object = (PrivateKeyInfo) pemParser.readObject();
        final PrivateKey pKey = converter.getPrivateKey(object);

I confirmed my JWT has all required fields:

{
  "kid": "SAME KEY AS MY KEY ID",
  "alg": "ES256"
}

{
  "iss": "Blahblah",
  "aud": "https://appleid.apple.com",
  "sub": "com.app.id",
  "exp": 1578513833,
  "iat": 1578513533
}

解決方案

This line caught my attention:

map.add("code", authorizationCode);  // JWT code we got from iOS

The authorizationCode is not a jwt

JSON Web Tokens consist of 3 parts separated by dots

but the authorizationCode has 4 parts like this:

text1.text2.0.text3

You are probably using the identityToken from the iOS app instead of the authorizationCode

This is how you retrieve it:

let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)!
print("authorizationCode: (authorizationCode)")

Also good to have the following in mind for those who might come here after getting the same invalid_client error:

  1. kid is the id for the private key from developer.apple.com/account/resources/authkeys/list

  2. keyFile is the file holding the private key downloaded from developer.apple.com

  3. teamID can be found by logging in to developer.apple.com and clicking on account, the teamID can be seen in the upper right corner

  4. the value in aud should be https://appleid.apple.com

  5. app_id is the bundle identifier for the app

In case it might help, here is a working solution in python to create a client_secret:

# $ pip install pyjwt
import jwt
import time

kid = "myKeyId"  
keyFile = "/pathToFile/AuthKey.p8"
key = ""
with open(keyFile, 'r') as myFile:
    key = myFile.read()

print(key)

timeNow = int(round(time.time()))
time3Months = timeNow + 86400*90

claims = {
    'iss': teamID,
    'iat': timeNow,
    'exp': time3Months,
    'aud': 'https://appleid.apple.com',
    'sub': app_id,
}


secret = jwt.encode(claims, key, algorithm='ES256', headers={'kid': kid})
print("secret:")
print(secret)
client_secret = secret.decode("utf-8")
print(client_secret)

這篇關于invalid_client 用于使用蘋果登錄的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How to wrap text around components in a JTextPane?(如何在 JTextPane 中的組件周圍環繞文本?)
MyBatis, how to get the auto generated key of an insert? [MySql](MyBatis,如何獲取插入的自動生成密鑰?[MySql])
Inserting to Oracle Nested Table in Java(在 Java 中插入 Oracle 嵌套表)
Java: How to insert CLOB into oracle database(Java:如何將 CLOB 插入 oracle 數據庫)
Why does Spring-data-jdbc not save my Car object?(為什么 Spring-data-jdbc 不保存我的 Car 對象?)
Use threading to process file chunk by chunk(使用線程逐塊處理文件)
主站蜘蛛池模板: 农村妇女毛片精品久久久 | 欧美日韩视频在线播放 | 蜜臀网 | 亚洲精品日韩一区二区电影 | 一级黄色裸片 | 四虎在线视频 | 91精品国产欧美一区二区 | 亚洲欧美一区二区三区情侣bbw | www.国产日本| 精品乱人伦一区二区三区 | 二区在线观看 | 一级毛片在线播放 | 在线国产一区二区 | 91精品国产乱码久久久久久久久 | 日本一区二区三区视频在线 | 欧美a视频 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美一级黄色免费 | 成人超碰| 超碰520 | 一区二区在线不卡 | 精品欧美黑人一区二区三区 | 成人a视频片观看免费 | 福利电影在线 | 久久久久国产一区二区三区四区 | 91欧美激情一区二区三区成人 | 久久久久一区二区 | 国产免费一级一级 | 国产精品福利视频 | 五月婷婷亚洲 | 免费久久99精品国产婷婷六月 | 亚洲精品成人 | 毛片a级毛片免费播放100 | 欧美a在线看 | 国产精品久久久久久久久久免费看 | 亚洲一区二区三区四区在线观看 | 黄色日本视频 | 香蕉视频91| 中文字幕免费视频 | 91免费高清视频 | 久久精品91久久久久久再现 |