One-Tap Login API
Last updated:2025-05-29
One-Tap Login API
Functional description
Submit loginToken, then returns the encrypted cell phone number.
Call Address
Android、Harmony、iOS Use
POST https://api.verification.jpush.cn/v1/web/loginTokenVerify
Web Use
POST https://api.verification.jpush.cn/v1/web/h5/loginTokenVerify
Call Authentication
See for more information REST API Overview Authentication Note.
Example request
curl --insecure -X POST -v https://api.verification.jpush.cn/v1/web/loginTokenVerify -H "Content-Type: application/json" -u "7d431e42dfa6a6d693ac2d04:5e987ac6d2e04d95a9d8f0d1" -d '{
"loginToken": "STsid0000001542695429579Ob28vB7b0cYTI9w0GGZrv8ujUu05qZvw",
"exID": "1234566"
}'
curl --insecure -X POST -v https://api.verification.jpush.cn/v1/web/loginTokenVerify -H "Content-Type: application/json" -u "7d431e42dfa6a6d693ac2d04:5e987ac6d2e04d95a9d8f0d1" -d '{
"loginToken": "STsid0000001542695429579Ob28vB7b0cYTI9w0GGZrv8ujUu05qZvw",
"exID": "1234566"
}'
This code block is shown in the floating window
** Request parameters**
| Keyword | Type | Options | Meaning |
|---|---|---|---|
| loginToken | String | Required | Authentication SDK Received loginToken |
| exID | String | Optional | Developer custom id, not required |
Response Example
Request succeeded
{
"id": 117270465679982592,
"code": 8000,
"content": "get phone success",
"exID": "1234566",
"phone": "HpBLIQ/6SkFl0pAq0LMdw1aZ8RHoofgWmaY//LE+0ahkSdHC5oTCnjrR8Tj8y5naKVI03torFU+EzAQnwtVqAoQyYckT0S3Q02TKuAal3VRGiR5Lmp4g2A5Mh4/W5A4o6QFviHuBVJZE/WV0AzU5w4NGhpyQntOeF0UyovYATy4="
}
{
"id": 117270465679982592,
"code": 8000,
"content": "get phone success",
"exID": "1234566",
"phone": "HpBLIQ/6SkFl0pAq0LMdw1aZ8RHoofgWmaY//LE+0ahkSdHC5oTCnjrR8Tj8y5naKVI03torFU+EzAQnwtVqAoQyYckT0S3Q02TKuAal3VRGiR5Lmp4g2A5Mh4/W5A4o6QFviHuBVJZE/WV0AzU5w4NGhpyQntOeF0UyovYATy4="
}
This code block is shown in the floating window
** Request failed**
{
"code": 8001,
"content": "get phone fail"
}
{
"code": 8001,
"content": "get phone fail"
}
This code block is shown in the floating window
** Response parameters**
| Keyword | Type | Meaning |
|---|---|---|
| id | Long | Drift. Could be empty if the request goes wrong. |
| exID | String | Developer custom id if request is empty |
| code | Integer | Return Code |
| content | String | Response Code Reference |
| phone | String | Encrypted cell phone number.Jiguang Example of parsed cell phone number: Continental number:13812345678;Hong Kong mobile number:+852-12345678 |
RSA Example of private key decryption
Java
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class RSADecrypt {public static void main(String[] args) throws Exception {String encrypted = args[0];
String prikey = args[1];
String result = decrypt(encrypted, prikey);
System.out.println(result);
}
public static String decrypt(String cryptograph, String prikey) throws Exception {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte [] b = Base64.getDecoder().decode(cryptograph);
return new String(cipher.doFinal(b));
}
}
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class RSADecrypt {public static void main(String[] args) throws Exception {String encrypted = args[0];
String prikey = args[1];
String result = decrypt(encrypted, prikey);
System.out.println(result);
}
public static String decrypt(String cryptograph, String prikey) throws Exception {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte [] b = Base64.getDecoder().decode(cryptograph);
return new String(cipher.doFinal(b));
}
}
This code block is shown in the floating window
Python
#!/usr/bin/env python3
# 需要先安装 pycryptodome,直接使用 pip 安装即可,仅在 python3 环境下测试通过
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
PREFIX = '-----BEGIN RSA PRIVATE KEY-----'
SUFFIX = '-----END RSA PRIVATE KEY-----'
encrypted = None
prikey = None
key = "{}\n{}\n{}".format(PREFIX, prikey, SUFFIX)
cipher = PKCS1_v1_5.new(RSA.import_key(key))
result = cipher.decrypt(base64.b64decode(encrypted.encode()), None).decode()
print(result)
#!/usr/bin/env python3
# 需要先安装 pycryptodome,直接使用 pip 安装即可,仅在 python3 环境下测试通过
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
PREFIX = '-----BEGIN RSA PRIVATE KEY-----'
SUFFIX = '-----END RSA PRIVATE KEY-----'
encrypted = None
prikey = None
key = "{}\n{}\n{}".format(PREFIX, prikey, SUFFIX)
cipher = PKCS1_v1_5.new(RSA.import_key(key))
result = cipher.decrypt(base64.b64decode(encrypted.encode()), None).decode()
print(result)
This code block is shown in the floating window
PHP
// https://www.php.net/manual/en/function.openssl-private-decrypt.php
$prefix = '-----BEGIN PRIVATE KEY-----';
$suffix = '-----END PRIVATE KEY-----';
$result = '';
$encrypted = null;
$prikey = null;
$key = $prefix. "\n". $prikey. "\n". $suffix;
$r = openssl_private_decrypt(base64_decode($encrypted), $result, openssl_pkey_get_private($key));
echo $result. "\n";
// https://www.php.net/manual/en/function.openssl-private-decrypt.php
$prefix = '-----BEGIN PRIVATE KEY-----';
$suffix = '-----END PRIVATE KEY-----';
$result = '';
$encrypted = null;
$prikey = null;
$key = $prefix. "\n". $prikey. "\n". $suffix;
$r = openssl_private_decrypt(base64_decode($encrypted), $result, openssl_pkey_get_private($key));
echo $result. "\n";
This code block is shown in the floating window
Go
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"log"
)func main() {
PREFIX:= "-----BEGIN RSA PRIVATE KEY-----"
SUFFIX:= "-----END RSA PRIVATE KEY-----"
prikey:= ""encrypted:=""
encryptedB, err:= base64.StdEncoding.DecodeString(encrypted)
if err!= nil {log.Println("invalid encrypted")
return
}
key:= PREFIX + "\n" + prikey + "\n" + SUFFIX
result, err:= RsaDecrypt(encryptedB, []byte(key))
if err!= nil {log.Println("err:", err)
return
}
log.Println("result:", string(result))
}
// 私钥解密
func RsaDecrypt(encrypted, prikey []byte)([]byte, error) {var data []byte
block, _:= pem.Decode(prikey)
if block == nil {return data, errors.New("private key error")
}
rsaKey, err:= x509.ParsePKCS8PrivateKey(block.Bytes)
if err!= nil {return data, err}
key, ok:= rsaKey.(*rsa.PrivateKey)
if!ok {return data, errors.New("invalid private key")
}
data, err = rsa.DecryptPKCS1v15(rand.Reader, key, encrypted)
return data, err
}
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"log"
)func main() {
PREFIX:= "-----BEGIN RSA PRIVATE KEY-----"
SUFFIX:= "-----END RSA PRIVATE KEY-----"
prikey:= ""encrypted:=""
encryptedB, err:= base64.StdEncoding.DecodeString(encrypted)
if err!= nil {log.Println("invalid encrypted")
return
}
key:= PREFIX + "\n" + prikey + "\n" + SUFFIX
result, err:= RsaDecrypt(encryptedB, []byte(key))
if err!= nil {log.Println("err:", err)
return
}
log.Println("result:", string(result))
}
// 私钥解密
func RsaDecrypt(encrypted, prikey []byte)([]byte, error) {var data []byte
block, _:= pem.Decode(prikey)
if block == nil {return data, errors.New("private key error")
}
rsaKey, err:= x509.ParsePKCS8PrivateKey(block.Bytes)
if err!= nil {return data, err}
key, ok:= rsaKey.(*rsa.PrivateKey)
if!ok {return data, errors.New("invalid private key")
}
data, err = rsa.DecryptPKCS1v15(rand.Reader, key, encrypted)
return data, err
}
This code block is shown in the floating window
Was this document helpful?