使用 Parse Server 进行数字身份验证

Digits Authentication with Parse Server

在构建小型 Android 应用程序时,我决定尝试 Digits to login with a phone number and Parse 后端。

我如何验证与 Parse 服务器的 Digits 会话?

我从下面的例子开始,虽然我不确定这是否是 'correct'(改编自 this post)。

Android 客户:

  1. 从数字中请求身份验证 (oauth?) 令牌和用户 ID

    一个。发送一个数字密钥和秘密,检索一个对象

  2. 使用 Parse 验证此会话

    一个。发送 phone 号码、授权令牌和用户 ID

    b。如果授权有效,接收用户信息确认

解析:

  1. Auth 端点采用 phone 号码、auth 令牌和用户 ID

    一个。使用 twitter endpoint

    验证

    b。将身份验证令牌哈希和用户 ID 插入会话 table(未来的请求将 ping 这个 table,而不是 twitter)

    c。 Return 向客户确认

上面说得有道理,但是 Parse Example with Github login 似乎做了一些稍微不同的事情。使用 Parse,对第三方的初始请求是从 Parse 服务器发出的,而不是客户端。

Github 需要发送一个 'state' 参数,这似乎就是为什么 Parse 示例从服务器发送初始请求,而 Digits 不需要这样的参数。这是否会降低 Digits 身份验证的安全性?有没有办法让这个过程更secure/correct?

这是我当前解决方案的 gist

在解析方面,我发送了一个类似于以下内容的 http 请求:

// Within a /verify_credentials webhook
Parse.Cloud.httpRequest({
    method: 'GET',
    url: req.get(headers[0]),
    headers: {'Authorization': req.get(headers[1])},

    success: function(httpResponse) {
        var obj = JSON.parse(httpResponse.text);
        res.status(httpResponse.status).send("success");
    },
    error: function(httpResponse) {
        res.status(400).json({
            error: 'Unable to make a twitter request'
        });
    }
});

在 Android 方面,我使用 headers:

中的 Parse session 信息向 Parse 服务器发送一个 http 请求
    TwitterAuthConfig authConfig = TwitterCore.getInstance().getAuthConfig();

    // Cast from AuthToken to TwitterAuthToken
    TwitterAuthToken authToken = (TwitterAuthToken)session.getAuthToken();

    OAuthSigning oAuthSigning = new OAuthSigning(authConfig, authToken);
    // First value should be the location we're querying to twitter. 
        // The second is the actual validation information
    Map<String, String> authHeaders = oAuthSigning.getOAuthEchoHeadersForVerifyCredentials();
    try {
        cloud.verifyCredentials(
                authHeaders.get("X-Auth-Service-Provider"),
                authHeaders.get("X-Verify-Credentials-Authorization"),
                session.getId(),
                callback);
    }