1

我正在尝试从 Withings Api 获取用户信息,我已经使用 Scribe 库(Java)通过 Oauth 成功登录 Withings。但是当我按照 Withings Api 文档发送获取用户信息的请求时出现问题,它总是返回带有错误代码的结果。

我尝试了一些方法,但没有奏效。有人可以帮我解决这个问题。

Withings API http://www.withings.com/en/api#documentation

首先,我在 WithingsController.groovy 中调用 withings 操作以获取身份验证。

在验证成功服务器返回访问令牌后,在 withingsCallback 操作中我获取用户信息。

获取用户信息时返回的结果是Withings Api的结果码

{“状态”:2554}

这是我的代码

WithingsService.groovy

def getAuthDetails(callbackUrl) {
    if (!authService) {

        authService = new ServiceBuilder()
                           .provider(WithingsApi.class)
                           .apiKey( grailsApplication.config.oauth.withings.key as String )
                           .apiSecret( grailsApplication.config.oauth.withings.secret as String )
                           .callback( callbackUrl as String )
                           .build();
        }

    Token requestToken = authService.getRequestToken();

    [ authUrl : authService.getAuthorizationUrl(requestToken), requestToken : requestToken ]

}
def getWithingsUserInformation(Token accessToken,String userId){
    String url = 'http://wbsapi.withings.net/user?action=getbyuserid&userid='+userId;
    OAuthRequest request = new OAuthRequest( Verb.POST, url )
    authService.signRequest(accessToken, request)
    Response response = request.send()
    return response
}

def getAccessToken( params, requestToken ){
    requestToken = requestToken as Token
    Verifier verifier = new Verifier( params.oauth_verifier )
    authService.getAccessToken(requestToken, verifier);
}

WithingsController.groovy

def withings() {
    def authInfo = withingsService.getAuthDetails(createLink(action: 'withingsCallback', controller: 'withings', absolute: 'true'))

    if (authInfo.requestToken)
    {
        session["withings_requestToken"] = authInfo.requestToken
    }

}

def withingsCallback(){
    def accessToken = withingsService.getAccessToken(params, session["withings_requestToken"])
    session["withings_accessToken"] = accessToken
    if(accessToken) {
        def profile 
        String userId = params.userid
        profile =  withingsService.getWithingsUserInformation(accessToken,userId)
       }
   }
4

2 回答 2

1

除非我遗漏了什么,否则您似乎没有重定向您的用户以获取“访问令牌”。获得请求令牌后:

  • 然后生成一个身份验证 url
  • 将用户重定向到此身份验证 url
  • 他们将进行身份验证
  • 如果身份验证成功,提供者将使用访问令牌调用您的回调

所以你的 withings 行动应该包括:

def withings() {
  def authInfo = withingsService.getAuthDetails(createLink(action: ....

  if (authInfo.requestToken)
  {
    session["withings_requestToken"] = authInfo.requestToken
  }

  //are you missing this? 
  redirect(authInfo.authUrl)
}

如果您使用某种类型的 http 调试/日志记录,请在执行操作后检查以下请求。

https://oauth.withings.com/account/authorize?
oauth_callback=http%3A%2F%2Fexample.com%2Fget_access_token
&oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b
&oauth_nonce=369f9ceb2f285ac637c9a7e9e98019bd
&oauth_signature=OR9J9iEl%2F2yGOXP2wk5c2%2BWtYvU%3D
&oauth_signature_method=HMAC-SHA1
&oauth_timestamp=1311778988
&oauth_token=5bb105d2292ff43ec9c0f633fee9033045ed4643e9871b80ce586dc1bf945
&oauth_version=1.0
于 2013-06-13T04:35:47.133 回答
0

虽然这与最初提出的问题无关,但我想我会在这里发帖,因为这是我遇到Withings 2554错误的常见停止点。

如果更新到最新版本的 Withings Api 以进行访问令牌身份验证,如果您不附加到访问令牌请求正文,当前版本的 Withings Api现在也会导致此 2554 状态代码。action: requesttoken

此外,在提取响应时,请确保深入了解body有效负载,因为最新版本的 Withings 访问令牌 API 以不同方式提供其有效负载内容。对于那些从头开始实现的人来说,这可能是一件轻而易举的事,但是如果您使用的是 oauth 库,那么大部分这种行为都是由库抽象的,并且它可能不会预期有效负载结构包含该body字段。

更多信息:https ://developer.withings.com/api-reference#operation/oauth2-getaccesstoken

于 2021-08-18T21:43:17.317 回答