ホームページ  >  記事  >  WeChat アプレット  >  WeChat パブリック プラットフォームの開発: OAuth2.0 の説明

WeChat パブリック プラットフォームの開発: OAuth2.0 の説明

高洛峰
高洛峰オリジナル
2017-02-27 13:28:031496ブラウズ

OAuth2.0 を理解する

まず、図を通して OAuth2.0 の動作モードを理解しましょう:

WeChat パブリック プラットフォームの開発: OAuth2.0 の説明

上の図から、プロセス全体に 2 つの「ハンドシェイク」が含まれ、最後に承認されたハンドシェイクが使用されることがわかります。 AccessToken は、一連のリクエストを実行します:

A: クライアントは通常、ジャンプ先の appId

URL などのパラメータ

ID をサーバーに送信します。検証後 (redirectUrl)

ステータス パラメーター (オプション)

認可スコープ スコープ (オプション)

応答タイプ (オプション)

B: サーバーは、Based と同様の付与認可 ID (WeChat ではデフォルトでコードと呼ばれます) を返します。ワンタイムの一時的な文字列キー。 A で redirectUrl が指定されている場合、サーバーはジャンプを実行し、grant パラメーターと status パラメーターを使用して redirectUrl にアクセスします。

C デフォルトは code です)

D: サーバーは ID、パスワード、許可が正しいことを確認した後、AccessToken を返します (ここでの AccessToken は、前の一般的なインターフェイスで導入された AccessToken とは何の関係もありません。高度なインターフェイスであり、相互に使用することはできません)

E: クライアントは AccessToken を使用して一連の API をリクエストします。このプロセスでは、appId、Secret、Grant などの機密情報は送信されなくなります。

F: サーバーはリクエストの結果を返します。

WeChat での OAuth2.0 の使用

OAuth2.0 の基本原理を理解した後、WeChat で OAuth2.0 がどのように使用されるかを見てみましょう。

シナリオを想定します: ユーザーが WeChat 公開アカウントを入力し、メッセージ内のリンクを通じて WeChat 埋め込みブラウザーでゲーム Web ページを開きます。このゲームでは、ユーザーがログインしてユーザーのゲーム スコアを記録する必要があります。

この状況に対処する方法は 2 つあります:

ユーザーが Web ページに登録してログインできるようにします (そして、WeChat の内蔵ブラウザーの Cookie の保存時間により、この Web ページを開くたびに再度ログインする必要がある場合があります)は非常に短い)、これはもちろん非常に不正な設計です。

OAuth2.0を利用します。ユーザーがこのページにアクセスすると、まずユーザーがログインしているかどうかが判断されます。ログインしていない場合は、自動的に OAuth2.0 認証ページにジャンプします。このページでは、上記の ABCD 一連の検証が自動的に実行され、EF を通じてユーザーの OpenId が取得されます。さらに詳細な情報(アバターを含む)を取得すると、自動的にログイン(または必要な登録)が完了し、ユーザーはログインした状態で直接ゲームに入ることができます。

OAuth2.0を使用するとユーザーエクスペリエンスが大幅に向上し、ユーザーのWeChat OpenIdを自動的にバインドして識別できることがわかります。

上記の「OAuth2.0 認証ページ」にも 2 つの形式があることに注意してください:

リクエスト A のスコープが snsapi_base の場合、認証プロセス全体が自動的に完了し、ユーザーのクライアントには何も表示されません。真ん中のページが表示されますが、認証結果はユーザーのOpenIdしか取得できません(ユーザーがユーザーをフォローしているかどうかは関係ありません。もちろん、ユーザーがユーザーをフォローしている場合は、ユーザー情報インターフェースを使用することも可能です) OpenId を使用してユーザー情報を取得するための高度なインターフェイスですが、いくつかの紆余曲折があります)

リクエスト A のスコープが snsapi_userinfo の場合、認証ページを提供する必要があります (多くの Web サイトが Weibo アカウントを使用する認証と同様)ユーザーが同意した場合にのみ、ユーザーはすぐに詳細情報を取得します。ここでのユーザーはフォローしているユーザーでもフォローされていないユーザーでもよく、返される内容は同じです。

つまり、snsapi_base のメソッドはユーザーの OpenId を「知らずに」取得し、ログインと登録のプロセスを完全に自動的に完了できますが、情報量は限られており、snsapi_userinfo はユーザーが指定されたインターフェイスで認証して自動的に完了する必要があります。プロセス全体 この承認には一定の期間があり、その後、ユーザーは再度尋ねられる必要があります。

Senparc.Weixin.MP OAuth2.0 インターフェイス

ソース ファイル フォルダー: Senparc.Weixin.MP/AdvancedAPIs/OAuth

ソース コード内の関連メソッドは次のとおりです:

namespace Senparc.Weixin.MP.AdvancedAPIs
{
    //官方文档:http://mp.weixin.qq.com/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code

    /// <summary>
    /// 应用授权作用域
    /// </summary>
    public enum OAuthScope
    {
        /// <summary>
        /// 不弹出授权页面,直接跳转,只能获取用户openid
        /// </summary>
        snsapi_base,
        /// <summary>
        /// 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
        /// </summary>
        snsapi_userinfo
    }

    public static class OAuth
    {
        /// <summary>
        /// 获取验证地址
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="redirectUrl"></param>
        /// <param name="state"></param>
        /// <param name="scope"></param>
        /// <param name="responseType"></param>
        /// <returns></returns>
        public static string GetAuthorizeUrl(string appId, string redirectUrl, string state, OAuthScope scope, string responseType = "code")
        {
            var url =
                string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect",
                                appId, redirectUrl.UrlEncode(), responseType, scope, state);

            /* 这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。
             * 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。这里的code用于换取access_token(和通用接口的access_token不通用)
             * 若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
             */
            return url;
        }

        /// <summary>
        /// 获取AccessToken
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="secret"></param>
        /// <param name="code">code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。</param>
        /// <param name="grantType"></param>
        /// <returns></returns>
        public static OAuthAccessTokenResult GetAccessToken(string appId, string secret, string code, string grantType = "authorization_code")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type={3}",
                                appId, secret, code, grantType);

            return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET);
        }

        /// <summary>
        /// 刷新access_token(如果需要)
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="refreshToken">填写通过access_token获取到的refresh_token参数</param>
        /// <param name="grantType"></param>
        /// <returns></returns>
        public static OAuthAccessTokenResult RefreshToken(string appId, string refreshToken, string grantType = "refresh_token")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type={1}&refresh_token={2}",
                                appId, grantType, refreshToken);

            return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET);
        }

        public static OAuthUserInfo GetUserInfo(string accessToken,string openId)
        {
            var url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",accessToken,openId);
            return CommonJsonSend.Send<OAuthUserInfo>(null, url, null, CommonJsonSendType.GET);
        }
    }
}

具体的なメソッドの例については、Senparc を参照してください。 Weixin.MP.Sample/Controllers/OAuth2Controller.cs、および対応するビューのコード。

OAuth インターフェイスを使用するには、認証されたサービス アカウントが必要です。

インターフェイスで使用される AccessToken とアドバンスト インターフェイス (一般インターフェイスを含む) で使用される AccessToken は、同じ AppId と Secret を通じて取得された場合でも、互いに関連しません。

現在の公式認証ページは 100% 安定しているわけではありません。そのような状況を見つけた場合は、いくつかの判断を行ってリクエストを繰り返す必要がある場合があります。少なくとも表面的には、ユーザーはエラーページ。

セキュリティ上の理由から、OAuth2.0 を使用する前に、WeChat バックエンドで [My Services] を入力してコールバック ページのドメイン名を設定する必要があります:

WeChat パブリック プラットフォームの開発: OAuth2.0 の説明

WeChat パブリック プラットフォームの開発: OAuth2.0 の説明

その他の WeChat パブリック プラットフォーム開発: OAuth2。 0 関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。