Node.js 使用OAuth2.0背后的NopCommerceAPI

Node.js 使用OAuth2.0背后的NopCommerceAPI,node.js,nopcommerce,Node.js,Nopcommerce,我的目标是使用一个已经与nopCommerce一起部署的API(我没有对服务器的开发访问权限-我只是一个用户)。有一个示例客户机应用程序,但代码是C#。我使用node.js在Azure服务器上部署了一个webapp。API使用了 我在谷歌上搜索了一下,似乎客户端\u凭据通常用于这种类型的服务器到服务器流: 这里还有一个答案,建议我可以手动检索令牌,然后将其存储在服务器上。这就是我目前在测试代码时正在做的事情 我还发现了这个答案,它似乎在问同样的问题。像那篇文章的作者一样,我可以通过Postm

我的目标是使用一个已经与nopCommerce一起部署的API(我没有对服务器的开发访问权限-我只是一个用户)。有一个示例客户机应用程序,但代码是C#。我使用node.js在Azure服务器上部署了一个webapp。API使用了

我在谷歌上搜索了一下,似乎
客户端\u凭据
通常用于这种类型的服务器到服务器流:

这里还有一个答案,建议我可以手动检索令牌,然后将其存储在服务器上。这就是我目前在测试代码时正在做的事情

我还发现了这个答案,它似乎在问同样的问题。像那篇文章的作者一样,我可以通过Postman获得令牌,但是我的node.js代码失败了

我在node.js中编写了一个简单的示例


似乎您在
oauth 2.0
中签出了两条腿的oauth,那么您为什么不使用它作为您的案例(没有用户干扰的服务器通信)?@PrakashThete服务器似乎没有启用两条腿的身份验证。我无法访问服务器来更改身份验证方案。似乎您在
oauth 2.0
中签出了两条腿的oauth,那么您为什么不使用它作为您的案例(没有用户干扰的服务器-服务器通信)?@PrakashThete服务器似乎没有启用两条腿的身份验证。我无权访问服务器以更改身份验证方案。
import { config } from 'dotenv';
import * as path from 'path';
import fetch from 'cross-fetch';

const ENV_FILE = path.join(__dirname, '.env');
const loadFromEnv = config({ path: ENV_FILE });

export async function getCodeUrl() {
    const params = {
        client_id: <CLIENT_ID>,
        redirect_uri: 'http://example.com',
        response_type: 'code',
    };
    console.log(params);

    const url = new URL(`http://example.com/OAuth/Authorize`);
    Object.keys(params).forEach(( key ) => url.searchParams.append(key, params[key]));
    const res = await fetch(url.href, { method: 'GET' });
    return res;
}

export async function getToken(code: string) {
    const url = new URL(`http://example.com/api/token`);
    const options = {
        form: {
            client_id: <CLIENT_ID>,
            client_secret: <CLIENT_SECRET>,
            code,
            grant_type: 'authorization_code',
            redirect_ui: 'http://example.com',
        },
        headers: { 'content-type': 'application/x-www-form-urlencoded' },
        method: 'POST',
    };

    console.log(options);
    const res = await fetch(url.href, options);
    console.log('res', res);
    return res;
}

const test = async () => {
    const codeUrlString = (await getCodeUrl()).url;
    const code = (new URL(codeUrlString).searchParams.get('code'));
    if (code) {
        console.log('code', code);
        const tokenResponse = await getToken(code);
        console.log('token res', tokenResponse);
    }
};

test();
{ error: 'invalid_client' }