【问题标题】:Verifying Back-End Calls from Android Apps验证来自 Android 应用的后端调用
【发布时间】:2013-01-06 22:13:24
【问题描述】:

我正在关注next tutorial 以保护我的 Rest 服务。

但是我对步骤验证令牌字段有问题,首先我不知道我的依赖项是否正确:

    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client</artifactId>
        <version>1.13.1-beta</version>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client-gson</artifactId>
        <version>1.13.1-beta</version>
    </dependency>

其次,当我像示例中那样使用 Checker 类时,在调用 Verifier.verify(token) 时它返回 false,这是因为在类 GoogleIdTokenVerifier 中设置了 clientIds。我一步一步跟着教程,我完全迷路了

谢谢大家。


编辑:这是我现在正在使用的代码,它似乎正在工作:

public class Checker {

private final String mAudience;
private final Lock lock = new ReentrantLock();
private final GoogleIdTokenVerifier mVerifier;
private final JsonFactory mJFactory;
private String mProblem = "Verification failed. (Time-out?)";
private final List<String> mClientIDs;
private List<PublicKey> publicKeys;
private final Clock clock;
NetHttpTransport transport;
private long expirationTimeMilliseconds;

public Checker(String[] clientIDs, String audience) {
    mClientIDs = Arrays.asList(clientIDs);
    mAudience = audience;
    transport = new NetHttpTransport();
    mJFactory = new GsonFactory();
    mVerifier = new GoogleIdTokenVerifier(transport, mJFactory);
    clock = Clock.SYSTEM;
}

public GoogleIdToken.Payload check(String tokenString) {
    GoogleIdToken.Payload payload = null;

    try {
        GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString);
        if (checkSignature(mClientIDs.get(0), token)) {
            GoogleIdToken.Payload tempPayload = token.getPayload();
            if (!tempPayload.getAudience().equals(mAudience))
                mProblem = "Audience mismatch";
            else if (!mClientIDs.contains(tempPayload.getIssuee()))
                mProblem = "Client ID mismatch";
            else
                payload = tempPayload;
        }
    } catch (GeneralSecurityException e) {
        mProblem = "Security issue: " + e.getLocalizedMessage();
    } catch (IOException e) {
        mProblem = "Network problem: " + e.getLocalizedMessage();
    } catch (Exception e) {
        mProblem = "Problem: " + e.getLocalizedMessage();
    }
    return payload;
}

public String problem() {
    return mProblem;
}

boolean checkSignature(String clientIds, GoogleIdToken idToken)
        throws GeneralSecurityException, IOException {
    JsonWebSignature.Header header = idToken.getHeader();
    String algorithm = header.getAlgorithm();
    if (algorithm.equals("RS256")) {
        lock.lock();
        try {
            if (publicKeys == null
                    || clock.currentTimeMillis() + 300000 > expirationTimeMilliseconds) {
                mVerifier.loadPublicCerts();
                publicKeys = mVerifier.getPublicKeys();
                expirationTimeMilliseconds = mVerifier
                        .getExpirationTimeMilliseconds();
            }
            Signature signer = Signature.getInstance("SHA256withRSA");
            for (PublicKey publicKey : publicKeys) {
                signer.initVerify(publicKey);
                signer.update(idToken.getSignedContentBytes());
                if (signer.verify(idToken.getSignatureBytes())) {
                    return true;
                }
            }
        } finally {
            lock.unlock();
        }
    }
    return false;
}
}

【问题讨论】:

    标签: java android maven google-api-java-client google-oauth


    【解决方案1】:

    不知道你的依赖;那是 Maven 对吗?我是个 Maven 白痴。

    至于您的客户 ID,代码假定您将传入一个客户 ID 列表,因为您想确保知道您将与哪个客户交谈。如果您不想这样做,我可以看到两个明显的选择:

    • 只需删除构造函数的clientIds参数、mClientIDs成员变量和check()方法中的“if (!mClientIDs.contains()”调用即可。

    • 更改代码以跳过检查 mClientIDs 是否为空

    【讨论】:

    • 感谢您的帮助,蒂姆。我想我通过使用接收clientIds作为参数而不是只接收令牌的verify版本解决了clientIds的问题: verify(Set clientIds, GoogleIdToken idToken) 但是现在我有另一个问题:当GoogleIdTokenVerifier 的 verify 方法检查它失败的有效负载,因为它将 payload.isValidTime(300) 评估为 false。最后,我设法用我刚刚放入原始问题的代码来解决它。这是正确的吗?再次感谢!
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多