Necesita usar la biblioteca Composer: firebase/php-jwt
simplemente 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 $keys
la 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 $header
contiene uno , y también hay una clave correspondiente al valor kid
en el analizado$parsedKeys
kid
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 . decode
El 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
- Después de la autorización de inicio de sesión de Apple, el front-end obtiene
identityToken
otrouser
ademásOpenID
, pero no esOpenID
confiable y se puede comparar después de decodificar el JWT; - El período de validez de JWT es de 10 minutos;