【问题标题】:OneDrive Code Flow Public clients can't send a client secret - Node.jsOneDrive 代码流公共客户端无法发送客户端密码 - Node.js
【发布时间】:2017-08-02 10:35:52
【问题描述】:

大家好,我想创建对我的 onedrive 帐户的访问权限,以便从我的家用电脑窗口通过 node.js 上传文件。

我在https://apps.dev.microsoft.com创建了一个应用程序
我还在那里创建了一个客户端密码并添加了一个 Web 平台并将重定向 url 从 localhost 更改为 https://login.live.com/oauth20_desktop.srf

然后我在浏览器中使用了这个链接 https://login.live.com/oauth20_authorize.srf?client_id=ab82982b-4dxxxxxxxxxxxxxxxxx&scope=files.readwrite.all&response_type=code

我浏览器中的 URL 更改为 https://login.live.com/oauth20_desktop.srf?code=M494a5b9fxxxxxxxxxxxxxxxxxxxxxxx&lc=1031

然后我发出一个 POST 请求,就像他们在 https://dev.onedrive.com/auth/graph_oauth.htm 上所说的那样

request({
  uri: "https://login.microsoftonline.com/common/oauth2/v2.0/token?"
  + "&client_id=ab82982b-4dbe-4c6b-a1fe-2d60d01709fd&"
  + "client_secret=TkYZhYyuEiSoqhCxbh4Dqh3"
  + "&code=M494a5b9f-5577-3454-a78c-cef649a512c0"
  + "&grant_type=authorization_code",
  method: "POST",
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
}, function(error, response, body) {
  console.log('body: ', body);
});

但是输出是

body:  {"error":"invalid_request","error_description":"AADSTS90014: The 
request body must contain the following parameter: 'grant_type'.\r\nTrace 
ID:
de2c2dxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nCorrelation ID: 
de2f8b83xxxxxxxxxxxxxxxxxxxxxxxxx\r\nTimestamp: 2017-07-31 13:40:52Z","error_codes":[90014]
,"timestamp":"2017-07-31 13:40:52Z","trace_id":"de2c2da2xxxxxxxxxxxxxxxxxxx","correlation_id":"de2f8b8xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}

请帮助我在这个 API 令牌的东西上苦苦挣扎..

从下面的评论编辑我也改变了

request.post({url:'https://login.microsoftonline.com/common/oauth2/v2.0/token', form: {
    redirect_uri: 'https://login.live.com/oauth20_desktop.srf',
    client_id: 'abf3247c-d56a-xxxxxxxxxxxxxxxxxxxxx',
    client_secret: '3o6xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    code: 'M8aad1bcf-xxxxxxxxxxxxxxxxxxxxxxxxxx',
    grant_type: 'authorization_code'
}
}, function(err,httpResponse,body){ /* ... */ 
console.log('err: ' + err)
console.log('body: ' + body)
})

但现在我得到 "error":"invalid_request","error_description":"AADSTS90023: Public clients can't send a client secret。

我在谷歌上搜索并读到我无法使用桌面应用程序发出客户端秘密请求。但我在https://apps.dev.microsoft.com 创建了一个网络应用程序

此外,我从请求中删除了客户端密码,我收到重定向 url 错误的错误消息。请发给我工作代码示例,我现在为此苦苦挣扎了好几天..

这太难了啊啊啊啊啊啊啊啊啊啊啊啊啊啊:D请帮忙

【问题讨论】:

  • 尝试使用额外的form 参数发送请求?我不确定request 模块是否会自动解析 URI。使用 url 编码形式的示例见here
  • 啊我想我知道你的意思我会尝试

标签: node.js onedrive


【解决方案1】:

您的这个问题已经打开了吗?您似乎想要检索访问令牌和刷新令牌。如果我误解了你的问题,我很抱歉。

我认为您修改后的用于检索访问令牌的脚本没有错。请再次确认授权流程。

  1. https://apps.dev.microsoft.com/添加应用程序
  2. 输入应用程序名称。在这种情况下,请勿使用引导式设置
  3. 创建应用程序密码。
  4. 平台是网络。在这种情况下,重定向 URL 是 http://localhost
  5. https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=### Application ID ###&scope=offline_access%20files.readwrite.all&response_type=code&redirect_uri=http://localhost检索代码
    • 请将上述网址导入浏览器,并从重定向的网址中检索代码。
    • 这里,为了上传文件,它在范围内包含files.readwrite.all
    • 可以通过将offline_access 包含到范围内来检索刷新令牌。
  6. 运行以下脚本以检索访问令牌并刷新令牌。

脚本:

request.post({
    url:'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    form: {
        redirect_uri: 'http://localhost',
        client_id: 'abf3247c-d56a-xxxxxxxxxxxxxxxxxxxxx',
        client_secret: '3o6xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        code: 'M8aad1bcf-xxxxxxxxxxxxxxxxxxxxxxxxxx',
        grant_type: 'authorization_code'
    }
}, function(err,httpResponse,body){
    console.log('body: ' + body)
});

回应:

您可以检索以下响应。

{
  "token_type": "Bearer",
  "scope": "Files.ReadWrite.All",
  "expires_in": 3600,
  "ext_expi
res_in": 0,
  "access_token": "#####",
  "refresh_token": "#####"
}

如果这不是您的解决方案,我很抱歉。

从刷新令牌中检索访问令牌的脚本:

request.post({
    url:'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    form: {
        redirect_uri: 'http://localhost',
        client_id: 'abf3247c-d56a-xxxxxxxxxxxxxxxxxxxxx',
        client_secret: '3o6xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
        grant_type: 'refresh_token'
    }
}, function(err,httpResponse,body){
    console.log('body: ' + body)
});

【讨论】:

  • 我之前用 localhost 作为重定向 url 尝试过这种方式,但它从来没有工作过。现在我明白了原因,因为如果我访问localhost,我会被重定向到localhost/dashboard,这是我从未在网址中看到代码的原因。我将重定向 url 更改为 localhost/dashboard 并获取代码。我现在也得到了我的访问令牌,谢谢!但是这个令牌也会在 1 小时后过期。如果我重用它告诉我代码已过期的代码。但我不想总是在我的浏览器中打开代码请求 url。如何使用 node.js 完成它?
  • @t33n 运行脚本时,响应中是否包含刷新令牌?当范围与我的答案相同时,您可以检索刷新令牌。请证实。您可以使用刷新令牌检索访问令牌。在这种情况下,您无需打开浏览器。如果你不能重定向http://localhost 的URI,你可以使用http://localhost:8080 使用端口号。可以设置端口号。
  • @t33n 刷新令牌也有生命周期。但最长可达1年。 docs.microsoft.com/en-us/azure/active-directory/develop/…
  • 是的,我获得了一个刷新令牌并尝试将其包含在我的上传脚本中,但出现错误:错误:缺少 params.accessToken。你能告诉你如何用刷新代码接收新的访问令牌你使用什么代码?我尝试了类似的方法,但在pastebin.com 上方出现了丢失的错误,但我使用了这个非官方的 onedrive npm 模块。你有使用刷新令牌上传文件的示例代码吗?
  • @t33n 欢迎您,也谢谢您。因为我是第一次使用OneDrive,所以也可以在这里学习。即使站点不同,oauth2 也是相同的结构。所以你也可以在其他网站上使用它。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2020-09-03
  • 2018-03-13
  • 1970-01-01
  • 2017-11-28
  • 2021-01-01
  • 2021-11-10
  • 2015-07-11
相关资源
最近更新 更多