PHP accede al inicio de sesión de Apple para realizar la verificación JWT en access_token/identityToken

Necesita usar la biblioteca Composer: firebase/php-jwtsimplemente instálela directamentecomposer require firebase/php-jwt

Análisis de encabezados JWT

uni.login()Obtener JWT a través del método en UniApp en un ejemplo sencillo

let type = 'apple'

uni.getProvider({
    
    
    service: 'oauth',
    success: function(res) {
    
    
        if (res.provider.includes(type)) {
    
    
            uni.login({
    
    
                provider: type,
                success: function(authed) {
    
    
                    console.log('三方登录获取用户信息成功', authed)

                    // Apple 登录这儿可用 authed.authResult 或 authed.appleInfo 得到授权数据
                    // authResult.access_token 与 appleInfo.identityToken 相同;authResult.openid 与 appleInfo.user 相同
                    // TODO: 登录请求
                },
                fail: function(err) {
    
    
                    console.log('三方登录获取登录信息失败', err)

                    if (err.errCode === 1001) {
    
    
                        // 登录已取消
                    } else {
    
    
                        // 其它错误情况
                    }
                }
            })
        } else {
    
    
            // 当前环境不支持该登录方式
        }
    },
    fail: function(err) {
    
    
        console.log('获取三方登录信息异常', err)
    }
})

Ejemplo JWT:eyJhbGciOiAiUlMyNTYiLCJraWQiOiAiWXV5WG9ZIn0.

Tenga en cuenta que el JWT realmente obtenido es muy largo, pero solo se necesita la parte del encabezado para la verificación, por lo que podemos interceptar la parte del encabezado primero:

// 截取至第一个「点」的位置为 JWT 头
$header = json_decode(base64_decode(substr($token, 0, strpos($token, '.'))), true);

Obtener la clave pública de Apple

La clave pública se puede obtener directamente a través de la interfaz: https://appleid.apple.com/auth/keys

Debido a que no hay cambios, se recomienda decodificar y almacenar en caché después de la primera adquisición $keys = json_decode($keys, true), y tomarlo directamente del caché la próxima vez.

analizar $keys(clave pública)

Aquí debe usar la biblioteca Composer instalada:

$parsedKeys = \Firebase\JWT\JWK::parseKeySet($keys, true);

Obtener la clave de destino

La clave de destino mencionada aquí es $keysla clave utilizada para decodificar el JWT en, por supuesto, es posible que desee realizar un bucle $keys, ¡esto definitivamente no está en el río!

El obtenido inicialmente $headercontiene uno , y también hay una clave correspondiente al valor kiden el analizado$parsedKeyskid

Entonces podemos juzgar directamente:

if (!($parsedKeys[$header['kid']] ?? null)) {
    
    
    throw new \Exception('JWT decode failed');
}

Decodificar para obtener OpenID

Asegúrese de atrapar la excepción . decodeEl método generará 7 excepciones diferentes. Una forma simple y amigable es juzgar la excepción caducada por separado y responder al aviso amistoso.

try {
    
    
    $decoded = \Firebase\JWT\JWT::decode($token, $parsedKeys[$header['kid']]);
} catch (\Exception $e) {
    
    
    if ($e instanceof \Firebase\JWT\ExpiredException) {
    
    
        // 返回友好提示告知用户授权过期
    }

    // 可直接响应登录异常或参数异常
}

// JWT 中 sub 即为 OpenID
$openId = $decoded->sub;

decir algunas palabras más

  1. Después de la autorización de inicio de sesión de Apple, el front-end obtiene identityTokenotro userademás OpenID, pero no es OpenIDconfiable y se puede comparar después de decodificar el JWT;
  2. El período de validez de JWT es de 10 minutos;

Supongo que te gusta

Origin blog.csdn.net/maxsky/article/details/126904637
Recomendado
Clasificación