首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从grails上的Withings中获取用户信息

如何从grails上的Withings中获取用户信息
EN

Stack Overflow用户
提问于 2013-06-12 03:24:23
回答 2查看 2.1K关注 0票数 1

我试图从with获得用户信息,我已经成功地使用Scribe库(Java)使用Oauth登录到Withing。但是,当我发送请求以获取用户信息时,遵循Withings文档是有问题的,它总是用错误代码返回结果。

我试过一些方法,但都没成功。有人能帮我解决这个问题吗。

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

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

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

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

{“地位”:2554}

这是我的密码

WithingsService.groovy

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
       }
   }
EN

回答 2

Stack Overflow用户

发布于 2013-06-13 04:35:47

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

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

因此,您的withings操作应该包括:

代码语言:javascript
复制
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操作后检查以下请求。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-08-18 21:43:17

虽然这与最初提出的问题无关,但我想我应该在这里发布,因为这是我达到Withings 2554错误的一个常见的停止点。

如果更新到最新版本的Withings进行访问令牌身份验证,则如果不将目前版本的Withings附加到访问令牌请求主体,则action: requesttoken现在也将导致此2554状态代码。

此外,当分离响应时,请确保钻入有效负载的body,因为最新版本的传递其有效负载内容的方式不同。对于那些从头开始实现的人来说,这可能是不需要考虑的,但是如果您使用的是oauth库,那么大部分行为都是由库抽象出来的,而且很可能不会期望有效负载结构包含body字段。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17057209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档