0

Mozilla バックパック コネクト APIでバッジを発行したいと考えています(これをチェックしてください! )。そうするために、私はこのドキュメントに従いましたが、まだバッジを発行できません!

リフレッシュ トークンを使用して新しいアクセス トークンを取得しようとすると、まったく同じ問題が発生します。そのため、「新しいアクセス トークンを取得する」コードをここに投稿しました。これは、発行するコードよりも少し理解しやすいためです。

Javascriptではなく、cURLを使用してPHPでこれを行いたいと思います。

これが私のコードです:

$data = array(
    'grant_type' => 'refresh_token',
    'refresh_token' => $refreshToken
);
$url = $apiRoot .'/token';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'w+'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
var_dump($response);

curl_close($ch);

ここでは、同じドキュメントに記載されているように、新しいアクセス トークンを取得しようとしていますが、残念ながら、常に次の応答が返されます。

不正なリクエスト: /var/www/openbadges/node_modules/express/node_modules/connect/lib
の次の不正なリクエスト (/var/www/openbadges/node_modules/express/node_modules/connect/lib/proto.js:125:13)
/middleware/bodyParser.js:54:23
IncomingMessage で。(/var/www/openbadges/node_modules/express/node_modules/connect/lib/middleware/json.js:74:60)
で IncomingMessage.emit (events.js:92:17)
で _stream_readable.js:938:16
でprocess._tickCallback (node.js:419:13)

さらに詳しく見ると、リクエストが詳細になり、次のようになります。

> POST /api/token HTTP/1.1
Host: backpack.openbadges.org
Accept: /
Content-Type: application/json
Content-Length: 81

*アップロードが完全に送信されました: 81 バイトのうち 81 *
追加のものは正常に転送されません 。 ="set-cookie" < Content-Type: text/plain < Date: Fri, 29 May 2015 12:36:03 GMT < Set-Cookie: AWSELB=674101290634B07D75A3C1417FA6788D6E65270EC8D2D0E6014FB81FA4E878CAEA117D6E6334DB190F94A3D84909E9928F08D6B81651BDC3386AFC0A84F3A39F4B51E09B31;PATH=/;MAX-AGE=3600 < x-frame -options: DENY < X-Powered-By: Express < Content-Length: 478 < Connection: keep-alive < * ホスト backpack.openbadges.org への接続 #0 はそのままにします












* 接続 #0 を閉じる

したがって、基本的には、エラー 400「Bad Request」が返され、それ以上の情報はありません...

参考までに、 Javascriptでやろうとするとうまくいきます。私がこれを行う場合:

$.ajax({
    type: 'POST',
    url: 'https://backpack.openbadges.org/api/token',
    data: {
        grant_type: 'refresh_token',
        refresh_token: theRefreshToken
    },
    headers: {
        'Content-Type': 'application/json'
    },
    success: function(data, textStatus, req) {
        console.log(textStatus);
        console.log(data);
    },
    error: function(xhr, textStatus, err) {
        console.log(textStatus);
        console.log(err);
        console.log(xhr);
        console.log($(this));
    }
});

これは成功を返しますが、PHP cURLを使用すると機能しません! なぜ ?

私のバッジは有効です (問題なく検証に合格します)。

4

1 に答える 1

0

何時間も探しました!解決策は本当に簡単ですが、それほど明白ではありません...

この行で: !の代わりにcurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));使用する必要があります。json_encode()http_build_query()

このようにして:curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));そしてそれは動作します!わーい !

于 2015-05-29T14:19:23.327 に答える