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

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

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

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

验证成功服务器返回访问 token 后,通过withingsCallback操作,我将获得用户信息。

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



这是我的代码

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)
       }
   }

最佳答案

除非我缺少任何内容,否则您似乎没有在重定向用户以获取“访问 token ”。获得请求 token 后:

  • 然后生成一个认证URL
  • 将用户重定向到此身份验证URL
  • 他们将认证
  • 如果身份验证成功,提供程序将使用访问 token
  • 调用您的回调

    因此,您的提起诉讼应包括:
    def withings() {
      def authInfo = withingsService.getAuthDetails(createLink(action: ....
    
      if (authInfo.requestToken)
      {
        session["withings_requestToken"] = authInfo.requestToken
      }
    
      //are you missing this?
      redirect(authInfo.authUrl)
    }
    

    如果您使用的是某种类型的http调试/日志记录,请在执行withings操作后检查以下请求。
    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
    

    关于grails - 如何在Grails上从Withings api获取用户信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17057209/

    10-10 01:00