使用 Smartsheet API:如何在用户通过身份验证并进行重定向后访问用户数据 url?

Using Smartsheet API: How do I access user data after a user is authenticated and taken to redirect url?

上下文:我通过让 django 中的登录按钮将用户定向到节点服务器上的 /auth url,将 Node.js Smartsheet Oauth 流程集成到我的 Django 应用程序中。流程完成并且用户通过 Smartsheet 登录后,来自 Smartsheet 开发工具的重定向 URL 会将用户带回 Django 网站。

Objective:我正在尝试访问用户数据,以便在他们登录一个名为 user = undefined 的变量之前,在他们登录之后,名为 user 的变量是一个具有一组用户的对象来自智能表 API 的数据。此对象将包括:id、电子邮件、名字、姓氏等...

我试过几种方法:

  1. 我尝试从 /callback url 获取数据,OAuth 流程在其中生成并保存令牌数据,但遭到拒绝,这可能是由于深思熟虑的安全协议调用
  2. 我试过为当前用户玩“原始令牌请求”,可能从 Node.js 服务器访问它们,然后通过 post 请求发回数据。我还没有让它工作,post 用户数据似乎不正确,并且让 django 应用程序在 django 应用程序内部尝试将用户与其数据匹配。

我是不是遗漏了什么明显的东西?如何最好地从刚登录的用户那里获取用户数据?我想为他们显示他们的用户名,并将他们的用户名标记为他们从应用程序对智能表文件所做的更改。

感谢您的帮助!

用户在 OAuth 流程中的弹出对话框中选择 Allow 后,Smartsheet 重定向到您指定的回调 URL,并包含一些查询字符串参数回调结束 URL。其中一个参数是 code 参数,这是一个字符串值,您随后可以使用它来获取该用户的 API 访问令牌。

例如,假设这是用户在弹出对话框中选择 允许 后重定向到的 URL:

http://localhost:3000/callback?code=sample6p9qisx6a&expires_in=599080&state=MY_STATE

在本例中,code参数的值为sample6p9qisx6a

此时,您可以发出 POST /token 请求以获取用户的 API 访问令牌。 API 文档的 Request an Access Token 部分描述了如何发出此请求。请注意,它需要的参数之一是 code——设置为先前在回调 URL.

中收到的 code 查询字符串参数的值

POST /token 请求的成功响应将包含 属性 access_token,如本例所示:

{
    "token": {
        "access_token": "ll352u9jujauoqz4gstvsae05",
        "token_type": "bearer",
        "refresh_token": "e9x352a9mp4151le2505",
        "expires_in": 604799
    }
}

此时,您可以使用访问令牌发出Get Current User请求:GET users/me。请注意,访问令牌以这种格式指定为请求的 Authorization header 的一部分(注意:您将在此示例中将令牌 ll352... 替换为 access_token 属性 您收到了对您之前 POST /token 请求的回复:

Authorization: Bearer ll352u9jujauoqz4gstvsae05

获取当前用户 请求的成功响应将是一个 UserProfile object,其中包含有关用户的所有信息:

{
  "id": 48569348493401200,
  "email": "john.doe@smartsheet.com",
  "firstName": "John",
  "lastName": "Doe",
  "locale": "en_US",
  "timeZone": "US/Pacific",
  "account": {
    "name": "Team Smartsheet",
    "id": 942513719853956
  },
  "admin": true,
  "licensedSheetCreator": true,
  "groupAdmin": true,
  "resourceViewer": true,
  "jiraAdmin": false,
  "salesforceAdmin": false,
  "salesforceUser": false,
  "alternateEmails": [
    {
      "id": 12345,
      "email": "altEmail1@smartsheet.com",
      "confirmed": true                
    }
  ],
  "title": "Senior Sales Representative",
  "department": "Marketing",
  "company": "Smartsheet",
  "workPhone": "",
  "mobilePhone": "206 123-4567",
  "role": "Sales",
  "profileImage": {
    "imageId": "u!1!8ljad7w9-aY!AsDeH0wWv1Y!y9VvAgUOFdg",
    "height": 1050,
    "width": 1050
  },
  "sheetCount": 3,
  "lastLogin": "2016-08-15T18:32:47Z",
  "customWelcomeScreenViewed": "2016-08-12T12:15:47Z"
}

100% 有效,但设置过程非常繁琐。

用户点击登录后(从 django 服务器),他们被重定向到节点服务器,Oauth 进程的启动将他们带到授权 url(坦率地说,我使用节点 b/c 已经有示例代码)

然后它将用户重定向回授权代码在 url 中的网站。

然后你必须从 url 中提取代码,我尝试将该代码与 react/redux thunk 请求一起使用,但是 CORS 阻止了来自浏览器的请求,所以我无法做到这一点反应中的请求。

相反,我不得不使用 post 请求将此代码发送到 Django 后端。在 React 之后直接检查 post 请求的 return 以找到其 post 请求的 pk(条目 ID),并使用它向特定的 get/retrieve 请求入口编号。这个对其余 api 的获取请求最终在 views.py 中结束,其中触发了使用请求库并获取授权令牌 (user_data.objects.last()) 的外部 module/script。这些请求基于网站上的 curls,但已转换为请求。脚本完成后 运行 我有了用户数据。然后将此数据修补到数据库条目中(部分更新),并且由于 python 是同步的,因此在外部脚本完成之前获取请求无法完成,到那时获取请求所需的数据已在数据库中。

get 请求完成后,react 解析 json,并将其 post 发送到 redux 存储(因为我使用的是 redux)。

可能有更好的方法(因为我是新手),但对于将来寻找如何做到这一点的任何人来说,很有可能按照我描述的方式...