OAuth2,使用POST和Yet ...方法不允许?

时间:2017-06-21 20:00:58

标签: javascript node.js oauth oauth-2.0 discord

基本上我尝试创建一个需要与Discord API接口的网站,以检索用户信息。

为此,我使用名为Simple OAuth(https://github.com/lelylan/simple-oauth2)的库,无法获取授权代码以使用它返回令牌。我已经查看了lib的一些源代码。它正在使用POST,这似乎是获得"方法不允许"错误。我正在遵循授权代码流程示例,这是我的代码:

index.js

var express = require('express'),
    request = require('request');
var router = express.Router();
var config = require('../config.json');
var oauth2 = require('simple-oauth2').create(config.credentials);
var authorizationUri = oauth2.authorizationCode.authorizeURL({
    redirect_uri: config.redirect_uri,
    scope: config.scope,
    state: config.state
});
router.get('/login', function(req, res) {
    console.log(authorizationUri);
    res.redirect(authorizationUri);
});
router.get('/callback', function(req, res) {
    var code = req.query.code;
    var tokenConfig = {
        code: code
    };
    oauth2.authorizationCode.getToken(tokenConfig, function(err, result) {
        if (err) {
            console.error('Access Token Error', err.message);
            return res.json('Authentication failed');
        } 
        console.log('The resulting token:', result);
        var token = oauth2.acessToken.create(result);
        return res.status(200).json(token);
    });
});
module.exports = router;

根据示例,此代码块应该可以工作。 (如果你想知道,这是我的配置文件:)

config.json

{
    "credentials": {
        "client": {
            "id": "...",
            "secret": "..."
        },
        "auth": {
            "tokenHost": "https://discordapp.com/api",
            "authorizePath": "/oauth2/authorize",
            "tokenPath": "/oauth2/token",
            "revokePath": "/oauth2/token/revoke"
        }
    },
    "redirect_uri": ".../callback",
    "scope": "identify",
    "state": "..."
}

该程序使状态和代码完全恢复正常,但当我尝试将其POST回来获取令牌时,我一直收到错误405,方法不允许。

1 个答案:

答案 0 :(得分:1)

您正在获取405,因为您正在解析令牌端点的错误URL。您使用的库将tokenurl设置为:

const tokenUrl = url.resolve(config.auth.tokenHost, config.auth.tokenPath);

所以:

url.resolve('https://discordapp.com/api', '/oauth2/token')

将解决:

https://discordapp.com/oauth2/token

这将给你405响应。我认为您只需要在tokenHost值的末尾添加"/"

即。将您的配置更改为:

    "auth": {
        "tokenHost": "https://discordapp.com/api/",
        "authorizePath": "/oauth2/authorize",
        "tokenPath": "/oauth2/token",
        "revokePath": "/oauth2/token/revoke"
    } 

或:

    "auth": {
        "tokenHost": "https://discordapp.com",
        "authorizePath": "/oauth2/authorize",
        "tokenPath": "/api/oauth2/token",
        "revokePath": "/api/oauth2/token/revoke"
    } 

,这应该正确解析令牌网址。