OAuth2.0의 이해
먼저 그림을 통해 OAuth2.0의 동작 모드를 이해해보자:
위의 그림을 보면 알 수 있다. 전체 프로세스는 두 번의 "핸드셰이크"를 거쳐 최종적으로 승인된 AccessToken을 사용하여 일련의 요청을 수행했습니다. 관련 프로세스는 다음과 같습니다.
A: 클라이언트가 서버에 확인 요청을 보냅니다. 요청에는 일반적으로 다음 매개변수 전달이 포함됩니다.
appId와 같은 ID 식별
확인 후 이동할 URL(redirectUrl)
상태 매개변수(선택 사항)
인증 기능 도메인 범위(선택 사항)
응답 유형(선택 사항)
B: 서버는 일회성 인증과 유사하게 승인 인증 식별(WeChat에서는 이를 기본적으로 코드라고 부름)을 반환합니다. 임시 문자열 키. RedirectUrl이 A에 제공되면 서버는 점프하고 승인 및 상태 매개변수를 사용하여 RedirectUrl에 액세스합니다.
C: 클라이언트의 리디렉션Url 해당 페이지는 요청을 다시 시작하기 위해 승인을 사용합니다. 이 요청은 일반적으로
ID 식별
비밀번호
grant string (code) grant type (선택, 기본값은 WeChat 코드) D: 서버에서 ID, 비밀번호, grant가 맞는지 확인한 후 반환 AccessToken (참고, 여기서 AccessToken은 이전 일반 인터페이스 및 고급 인터페이스에서 도입된 AccessToken과 아무런 관련이 없으며 교차하여 사용할 수 없습니다.) E: 클라이언트는 AccessToken을 사용하여 일련의 API를 요청합니다. , 더 이상 프로세스에 appId, Secret, grant 및 기타 민감한 정보를 전달하지 않습니다. F: 서버가 요청 결과를 반환합니다. WeChat에서 OAuth2.0 사용하기OAuth2.0의 기본 원리를 이해한 후, WeChat에서 OAuth2.0이 어떻게 사용되는지 살펴보겠습니다. 시나리오를 가정해 보겠습니다. 사용자가 WeChat 공개 계정을 입력한 다음 메시지에 있는 링크를 통해 WeChat 내장 브라우저에서 게임 웹페이지를 엽니다. 이 게임에서는 사용자가 로그인하여 사용자의 게임 점수를 기록해야 합니다. . 이 상황을 처리할 수 있는 두 가지 방법이 있습니다. 사용자가 웹페이지에 등록하고 로그인하도록 허용합니다(그리고 WeChat에서는 이 웹페이지를 열 때마다 다시 로그인해야 할 수도 있습니다). 내장된 브라우징 서버의 쿠키 저장 시간은 매우 짧습니다.) 이는 물론 매우 사기적인 디자인입니다. OAuth2.0을 활용하세요. 사용자가 이 페이지에 들어가면 먼저 사용자가 로그인되어 있는지 확인합니다. 그렇지 않은 경우 자동으로 OAuth2.0 인증 페이지로 이동합니다. 이 페이지는 자동으로 위의 ABCD 일련의 확인을 수행한 다음 EF를 통해 사용자의 OpenId를 얻습니다. 그리고 더욱 자세한 정보(아바타 포함)는 자동으로 로그인(또는 필요한 등록) 과정을 완료한 후, 로그인된 상태로 바로 게임에 입장하게 됩니다. OAuth2.0을 사용하면 사용자 경험이 크게 향상되고 사용자의 WeChat OpenId를 자동으로 바인딩하고 식별할 수 있음을 알 수 있습니다. 위에서 언급한 "OAuth2.0 인증 페이지"에도 두 가지 형식이 있다는 점에 유의하세요. 요청 A의 Scope가 snsapi_base인 경우 전체 인증 프로세스가 자동으로 완료됩니다. 사용자의 클라이언트에 중간 페이지가 표시되지는 않지만 인증 결과는 사용자의 OpenId만 얻을 수 있습니다. (사용자가 사용자를 팔로우했는지 여부에 관계없이 물론 사용자가 사용자를 팔로우하는 경우 사용자 정보 인터페이스를 사용합니다. 사용자의 OpenId를 얻기 위해 다시 고급 인터페이스를 사용합니다. 정보도 제공되지만 약간의 우회가 있습니다. 요청 A의 범위가 snsapi_userinfo인 경우 인증 페이지를 제공해야 합니다(인증과 유사). 많은 웹사이트는 웨이보 계정과 QQ 계정을 사용하여 로그인합니다.) 사용자가 동의한 후에만 사용자의 세부 정보를 즉시 얻을 수 있습니다. 여기의 사용자는 팔로우하는 사용자일 수도 있고 팔로우하지 않은 사용자일 수도 있으며 반환되는 내용은 동일합니다. 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 백엔드에 [내 서비스]를 입력하여 콜백 페이지의 도메인 이름을 설정해야 합니다.
더 많은 WeChat 공개 플랫폼 개발: OAuth2.0 지침을 보려면 PHP 중국어 웹사이트에서 관련 기사를 주목하세요!