我的目标是使用已经被nopCommerce部署的API(我没有开发者对服务器的访问权限-我只是一个用户)。有一个示例客户端应用程序here,但是代码在C#中。我使用node.js在Azure服务器上部署了一个Webapp。该API使用OAuth 2.0 Authorization Code grant type。
我做了一些谷歌搜索,看来client_credentials
通常用于这种服务器到服务器的流:
How does 2-legged oauth work in OAuth 2.0?
Using OAuth for server-to-server authentication?
这里还有一个答案,建议我可以手动检索令牌,然后将其存储在服务器上。这是我目前在测试代码时正在做的事情。
我也找到了这个答案,似乎在问同样的问题。像该帖子的作者一样,我可以通过Postman获得令牌,但是我的node.js代码失败。
我在node.js here中写了一个最小的示例。
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();
我能够成功检索授权码,但是当我在POST请求中使用它来获取令牌时,会出现此错误:
{ error: 'invalid_client' }