【问题标题】:Where I get from IOS Firebase API the Apple Revoke Tokens Endpoint Parameters (client_id, client_secret, token)我从 IOS Firebase API 获得 Apple Revoke Tokens Endpoint Parameters (client_id, client_secret, token)
【发布时间】:2022-06-16 03:08:07
【问题描述】:

Apple 抱怨我的应用程序,因为我没有调用其余端点撤销令牌来删除帐户。 我必须按照本文档中的说明进行操作:https://developer.apple.com/documentation/sign_in_with_apple/revoke_tokens

要拨打电话,我需要获取 client_idclient_secrettoken。 我的应用程序中的登录过程由 Firebase 管理,当用户执行登录时我不会保存此信息。 因此,我需要从 IOS 上的 Firebase 身份验证中恢复这 3 个参数,以调用该撤销令牌端点。

IOS 上的 Firebase 身份验证 API 中可能有一个方法为我调用 Apple 端点 revoke_token,但我没有看到它。请告诉我,因为这样会好很多。

我这样解决了我的问题:

要生成 client_secret,我使用的是后端服务器。需要一个必须放在安全位置的密钥文件,并且用户设备不是一个。

其他 2 个参数我们在下面给出了第三个 client_secret 的好主意的响应。这个想法是为那些没有后端服务器的人创建一个 Firebase 函数。

创建client_secret的规则可以在这里找到:Creating the Client Secret在页面末尾。

【问题讨论】:

  • client_id, client_secret 不是您恢复的东西,它是您的捆绑包 ID,并且客户端密码已构建和签名。 Firebase 很可能永远不会提供执行此操作的方法,因为签名需要您的私钥作为密钥。 stackoverflow.com/questions/72476140/…
  • @loremipsum Firebase 已经通过推送通知做到了这一点。我们生成通知密钥文件,并发送给FB,FB使用我的密钥发送通知。在我看来,应该可以对注销流程做同样的事情。
  • 您可以提交功能请求。我不会指望它。这个 API 不是新的,需求已经很久了。但谁知道……
  • 我们如何获得token?来自这个 API appleid.apple.com/auth/token
  • 当用户认证你得到令牌。查看此 FB 文档上的 idTokenString firebase.google.com/docs/auth/ios/apple

标签: ios swift firebase firebase-authentication sign-in-with-apple


【解决方案1】:

我尝试了以下方法,发现在使用 Apple 设置登录时调用 Revoke Tokens 并没有消失。如果我的解决方案有误,请发表评论。

问题中提到,撤销需要三个必填值。

client_id:这是您可以在 Apple Developer's Identifiers 中找到的 App ID。团队 ID 是一个排除标识符。

client_secret: 一个秘密 JSON Web 令牌 (JWT),它使用与您的开发者帐户关联的 Sign in with Apple 私钥。您需要使用 JWT 创建它,我将在下面写下如何使用 firebase 函数创建它。

令牌: 需要撤销的令牌。就我而言,我想在用户登录时将其保存为 UserDefaults 并在离开服务时使用它。
ex) UserDefaults.standard.set(idTokenString, forKey: "appleIDToken")

对于client_secret,我必须创建一个JWT,所以我使用了Firebase Functions。

index.js:

exports.revokeToken = functions.https.onRequest( async (request, response) => {
    const appleIdToken = request.query.appleIdToken;

    const jwt = require('jsonwebtoken')
    const fs = require('fs')
    const qs = require('qs')
    const axios = require('axios');


    // Path to download key file from developer.apple.com/account/resources/authkeys/list
    let privateKey = fs.readFileSync('AuthKey_XXXXXXXXXX.p8');

    //Sign with your team ID and key ID information.
    let token = jwt.sign({ 
    iss: 'YOUR TEAM ID',
    iat: Math.floor(Date.now() / 1000),
    exp: Math.floor(Date.now() / 1000) + 120
    
    }, privateKey, { 
    algorithm: 'ES256',
    header: {
    alg: 'ES256',
    kid: 'YOUR KEY ID',
    } });

    //Data to be sent to Revoke Tokens API
    let data = {
        'token': appleIdToken,
        'client_id': 'YOUR CLIENT ID',
        'client_secret': token
    };


    return axios.post(`https://appleid.apple.com/auth/revoke`, qs.stringify(data), {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
    })
    .then(async res => {
        response.json(res.data);
    });
});

将此源​​部署到 firebase 函数,当用户离开您的服务时,发送令牌 (appleIdToken) 以调用这些函数。

JWT 生成请参考以下链接。

https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens
(创建客户端密码)

【讨论】:

  • 感谢您的回答,client_secret 我正在我的后端服务器上创建。但我明白你的意思,这对我很有启发。
  • appleIdToken和苹果登录响应的identityToken一样吗?
  • @zangw 是的,它与Sign In With Apple调用委托方法时提供的identityToken相同
【解决方案2】:

@Guilherme 所以,我正在做的是在我进行身份验证时在回调 url 中获取身份验证码。然后我通过调用https://appleid.apple.com/auth/token 验证身份验证码,从响应中获取 access_token 并将其传递回https://appleid.apple.com/auth/revoke,我收到了来自苹果的 200 响应。

所以我的问题是,当我调用 revoke 端点时,它是否只是当前会话?我以为它不会让我再次登录,但我能够再次登录(我目前没有从数据库中删除用户帐户。)目前正在尝试测试令牌撤销过程。

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2017-06-06
    相关资源
    最近更新 更多