【问题标题】:Twitter OAuth "Failed to validate signature and token."Twitter OAuth“无法验证签名和令牌。”
【发布时间】:2014-08-05 05:07:46
【问题描述】:

我无法从 Twitter API 获得响应。我在这里使用 scribe 1.3.5。当从一个页面调用 TwitterLoginServlet 时,它成功地将我重定向到 twitter 并允许我登录。但是,在回调中,TwitterCallbackServlet 在 oAuthResponse 中接收到以下信息。

代码 - 401 消息 - 未经授权 body - 无法验证 oauth 签名和令牌

我不熟悉同时使用 servlet 和 oauth,因此我完全有可能在以下代码中犯了一些愚蠢的错误。我相信这就是找到问题解决方案所需的全部内容,但如果您需要更多信息,我会警惕地检查这篇文章。

谢谢!

public class TwitterServlet extends HttpServlet {
private static final String SESSION_NAME_REQUEST_TOKN = "twitter.requestToken";

protected Token getRequestToken(HttpServletRequest req) {
    HttpSession session = req.getSession();
    try {
        return (Token) session.getAttribute(SESSION_NAME_REQUEST_TOKN);
    }
    finally {
        session.removeAttribute(SESSION_NAME_REQUEST_TOKN);
    }
}

protected void setRequestToken(HttpServletRequest req, Token token) {
    HttpSession session = req.getSession();
    session.setAttribute(SESSION_NAME_REQUEST_TOKN, token);
}

protected OAuthRequest createRequest() {
    OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.twitter.com/oauth/request_token");
    return request;
}
}

public class TwitterLoginServlet extends TwitterServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String callback = "http://" + request.getServerName() + ":" + request.getServerPort() + "/******/TwitterCallbackServlet";              
    OAuthService service = new ServiceBuilder().provider(TwitterApi.SSL.class)
                            .apiKey("******")
                            .apiSecret("******")
                            .callback(callback)
                            .build();
    Token requestToken = service.getRequestToken();
    setRequestToken(request, requestToken);
    response.sendRedirect(service.getAuthorizationUrl(requestToken));
    return;
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    doGet(request, response);
}
}
public class TwitterCallbackServlet extends TwitterServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    OAuthService service = new ServiceBuilder().provider(TwitterApi.SSL.class)
                            .apiKey("******")
                            .apiSecret("******")
                            .build();
    Token requestToken = getRequestToken(request);
    // TODO: Check if the requestToken matches the token of this request.


    String verifier = request.getParameter(OAuthConstants.VERIFIER);

    Token accessToken = service.getAccessToken(requestToken, new Verifier(verifier));

    OAuthRequest oAuthRequest = createRequest();

    service.signRequest(accessToken, oAuthRequest);

    Response oAuthResponse = oAuthRequest.send();

    String body = oAuthResponse.getBody();

    response.sendRedirect("/******/accountSettings.xhtml");

}

【问题讨论】:

    标签: servlets twitter oauth scribe


    【解决方案1】:

    为什么在获得访问令牌后再次访问requestToken 端点?尝试访问不同的资源,例如:

    "https://api.twitter.com/1.1/account/verify_credentials.json";

    请注意,您可以运行 TwitterExample 来检查是否正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2011-04-08
      • 2014-04-02
      • 2015-03-19
      相关资源
      最近更新 更多